Ich bin mir nicht sicher, ob das ist, was Sie suchen, aber es gibt einen Handler für Ausnahmen, die Threads beenden. Es ist ein Handler für jede Ausnahme, die nicht explizit vom Ziel des Threads abgefangen wird.
Der Standard "abgefangene Exception-Handler", ruft einfach printStackTrace()
auf den Throwable
den Stack-Trace zu System.err
zu drucken. Sie könnten jedoch replace dies mit Ihrem eigenen UncaughtExceptionHandler
, der die Ausnahme statt log4j protokolliert:
class Log4jBackstop implements Thread.UncaughtExceptionHandler {
private static Logger log = Logger.getLogger(Log4jBackstop.class);
public void uncaughtException(Thread t, Throwable ex) {
log.error("Uncaught exception in thread: " + t.getName(), ex);
}
}
Wenn Sie einen Testamentsvollstrecker Framework verwenden, an die übergeben Sie ein Runnable
Objekt, dessen Fäden wahrscheinlich ihre eigenen catch
Block haben, die verhindern Ausnahmen vom Erreichen des nicht abgefangenen Ausnahmebehandlers. Wenn Sie Runtime
Ausnahmen dort fangen wollen, einen Weg, es zu tun ist, jede Aufgabe in einer Logging-Wrapper zu wickeln, wie folgt aus:
class Log4jWrapper {
private final Logger log;
private final Runnable target;
Log4jWrapper(Logger log, Runnable target) {
this.log = Objects.requireNonNull(log);
this.target = Objects.requireNonNull(target);
}
public void run() {
try {
target.run();
} catch(RuntimeException ex) {
log.error("Uncaught exception.", ex);
throw ex;
}
}
}
...
Runnable realTask = ...;
executor.submit(new Log4jWrapper(Logger.getLogger(Whatever.class), realTask));
Meinten Sie „abgefangene“ Runtime? –
Ja ich meine "uncaught" RuntimeExceptions – DkS