11.10.1 | Abfangen von Exceptions |
Wenn in der run()-Methode eines Threads eine Exception auftritt, die nicht abgefangen wird, führt dies standardmäßig zum Abbruch des Threads und zur Ausgabe eines Stack-Trace.
In Kapitel 5 wurde gesagt, dass eine unbehandelte Exception entlang der Aufrufkette weitergeleitet und dass am Ende ein Stack-Trace ausgegeben wird, falls sie nirgends behandelt wird.
Nach Kenntnis von Threads und Thread-Gruppen muss man diese Betrachtung präzisieren: Wenn in einem Thread eine Exception auftritt, die in der Aufrufkette nicht abgefangen wird, ruft die Virtual Machine die Methode uncaughtException() der Thread-Guppe auf, zu der der Thread gehört.
Dieser Methode wird der Thread, in der die Exception aufgetreten ist, sowie die Exception selbst übergeben. Standardmäßig werden diese Parameter einfach an die übergeordnete Gruppe weitergereicht, indem deren uncaughtException() aufgerufen wird.
Die Ausgabe des Stack-Trace erfolgt dann, wenn die Aufrufkette bei einer Gruppe angekommen ist, die keine übergeordnete Gruppe mehr hat. Standardmäßig ist dies die Gruppe main.
Um eine andere Fehlerbehandlung zu implementieren, kann man eine Unterklasse von ThreadGroup ableiten und uncaughtException() überschreiben.
Im folgenden Beispiel wird eine ThreadGroup definiert, die ihre Threads dadurch »hochverfügbar« macht, dass im Falle einer unvorhergesehenen Exception sofort ein neuer Thread gestartet wird:class HAThreadGroup extends ThreadGroup { public HAThreadGroup(String name) { super(name); } public void uncaughtException(Thread t, Throwable exc) { String msg = exc.getClass().getName() +" in Thread: "+t; System.out.println(msg); try { // neues Exemplar erzeugen und starten ((Thread)t.getClass().newInstance()).start(); } catch(Exception e) { e.printStackTrace(); } } }Material zum Beispiel
- Quelltexte: