Werden in UncaughtExceptionHandler geworfene Fehler verschluckt?

8

Thread.UncaughtExceptionHandler gibt an, dass, wenn die Methode, die nicht abgefangene Ausnahmen behandelt, selbst eine Ausnahme auslöst, diese Ausnahme ignoriert wird:

  

void uncaughtException (Thread t, Throwable e):

     

Methode, die aufgerufen wird, wenn der angegebene Thread aufgrund der angegebenen beendet wird   Nicht abgefangene Ausnahme.

     

Jede von dieser Methode ausgelöste Ausnahme wird von Java ignoriert   Virtuelle Maschine.

Beim Testen hat die JVM jedoch die vom nicht abgefangenen Ausnahmehandler behandelten Ausnahmen nicht ignoriert:

%Vor%

Eclipse-Konsolenausgabe (JRE 1.7):

  

Ausnahme: java.lang.RuntimeException ausgelöst von der   UncaughtExceptionHandler im Thread "main"

Eine weitere Kuriosität, die ich herausgefunden habe, ist, dass die Ausgabe, die ich bekomme, nicht von System.err kommt. Es scheint von einem anderen Strom zusammen zu sein. Ich habe dies überprüft, indem ich System.err auf System.out umgeleitet habe, aber ich bekomme immer noch eine "rote" Ausgabe:

%Vor%

Die Ausgabe (Fettschrift bedeutet rote Farbe):

  

wahr

     

das ist schwarze Farbe

     

java.lang.Error: Testen Sie die Stacktrace-Farbe unter asf.df.main (df.java:13)

     

Ausnahme: java.lang.RuntimeException, ausgelöst vom UncaughtExceptionHandler im Thread "main"

Was ist die Erklärung für diese Phänomene?

Was passiert mit Fehlern, die in UncaughtExceptionHandler geworfen werden? Was ist das erwartete (dokumentierte oder garantierte) Verhalten?

    
Pacerier 18.07.2014, 22:27
quelle

2 Antworten

5

HotSpot JVM gibt die vom UncaughtExceptionHandler ausgegebenen Ausnahmen aus. Siehe JavaThread :: exit

%Vor%

JVM druckt diese Ausnahmen selbst direkt auf stderr unabhängig vom Status System.err - ob es umgeleitet wurde oder nicht.

Nun, diese Art der Warnung hat keinen Einfluss auf die Anwendung - in diesem Sinne wird die Ausnahme "ignoriert". Aber du hast Recht, dieses Verhalten ist nicht offensichtlich. Javadoc ist irreführend und sollte besser repariert werden.

    
apangin 19.07.2014, 22:47
quelle
2

Die Ausnahmen werden ignoriert und die Verarbeitung wird fortgesetzt, wenn sie von einem Nicht-Hauptthread ausgelöst wird.

Wenn es in main geworfen wird, ist der zurückgegebene Fehlercode nicht Null.

Die nicht behandelten Ausnahmen werden über syserr protokolliert.

%Vor%

Ausgabe:

In Kind UncaughtExceptionHandler am 2014-07-19T04: 10: 46.184Z

Ausnahme: java.lang.RuntimeException ausgelöst vom UncaughtExceptionHandler im Thread "Thread-0" Nach Unterthread: 2014-07-19T04: 10: 48.197Z Im Haupt-UncaughtExceptionHandler 2014-07-19T04: 10: 48.197Z

Ausnahme: java.lang.RuntimeException ausgelöst vom UncaughtExceptionHandler im Thread "main"

    
Jeff 19.07.2014 04:12
quelle