Nie jestem pewien, czy to jest to, czego szukasz, ale istnieje procedura obsługi wyjątków, które kończą wątki. Jest to procedura obsługi dla każdego wyjątku, który nie jest przechwytywany bezpośrednio przez cel wątku.
Domyślny "brak obsługi wyjątku" po prostu wywołuje printStackTrace()
na Throwable
, aby wydrukować ślad stosu do System.err
. Jednakże, można replace to z własnego UncaughtExceptionHandler
że rejestruje wyjątek LOG4J zamiast:
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);
}
}
Jeśli używasz ramy Executora, do której przechodzą Runnable
obiektu, jego wątków prawdopodobnie mają własne catch
blok, który zapobiega wyjątki od osiągnięcia nieprzechwyconego modułu obsługi wyjątku. Jeśli chcesz złapać Runtime
wyjątków tam, jednym ze sposobów na to jest owinąć każdego zadania w opakowaniu logowania, na przykład:
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));
Czy masz na myśli „przechwycone” RuntimeExceptions? –
Tak Mam na myśli "nieprzechwycony" Wyjątki RuntimeEvents – DkS