05.05 UncaughtExceptionHandler

Auch wenn Sie Ihr Programm sehr gewissenhaft aufbauen, strukturieren und fast alle möglichen Konstellationen durchspielen, kann es dennoch vorkommen, dass eine Exception auftritt mit der Sie nicht gerechnet haben. In diesem Fall wird die Exception über den Error-Stream mitsamt StackTrace ausgegeben und das Programm beendet. Sie haben dann keine Möglichkeit mehr in irgendeiner Weise auf den Fehler zu reagieren. Um dieses Problem zu umgehen, hilft Ihnen der UncaughtExceptionHandler.

Der UncaughtExceptionHandler (nachfolgend mit UEH abgekürzt) ist eine innere Schnittstelle der Thread-Klasse und kann für jeden Thread einzeln gesetzt werden. Da wir aber Threads erst zu einem späteren Zeitpunkt besprechen werden, wird in diesem Kapitel nur ein allgemeiner UEH eingesetzt.

Verwendungszweck des UEH

Wie oben erwähnt, wird der UEH immer dann aufgerufen, wenn eine nicht abgefangene Exception geworfen wird. Natürlich ist es in so einem Fall nützlich dem Benutzer des Programms mitzuteilen, dass ein unerwarteter Fehler aufgetreten ist. Zeitgleich sollte der Fehler mitgeloggt (sofern kein Logging-Tool wie z. B. log4j eingesetzt wird), und der User aufgefordert werden, den Fehler dem Programmierer weiterzuleiten. Auch können im UEH noch abschließende Einstellungen gespeichert, und Aktionen ausgeführt werden um bspw. Daten zu retten.

Ein eigener UEH

Die Programmierung eines UEH ist denkbar einfach. Sie benötigen lediglich eine Klasse, die das Interface Thread.UncaughtExceptionHandler implementiert und die dazugehörige Methode (uncaughtException) überschreibt. Dies könnte z. B. so aussehen:

package de.exception;

public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

  public void uncaughtException(Thread thread, Throwable throwable) {
    System.out.println("Ein unerwarteter Fehler ist aufgetreten");
  }
}

Der Code in der uncaughtException-Methode wird im Falle eines Fehlers aufgerufen. Dabei wird der Thread, der diese Fehlermeldung verursacht hat (Thread thread), und die eigentliche Fehlermeldung (Throwable throwable) übergeben.

Damit der UEH auch seine Arbeit verrichten kann, müssen Sie Ihrem Programm (in diesem Fall Ihrem Thread) noch mitteilen, dass genau dieser UEH verwendet werden soll. Dies geschieht mit folgender Codezeile:

Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

Zum Testen können Sie jetzt einmal mit UEH und einmal ohne UEH z. B. mit info

throw new NullPointerException();

eine Exception erzeugen und beobachten, was passiert.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.