No estoy seguro de si esto es lo que está buscando, pero hay un controlador para las excepciones que terminan los hilos. Es un controlador para cualquier excepción que no sea capturada explícitamente por el destino del hilo.
El controlador de excepción no capturado predeterminado simplemente llama al printStackTrace()
en el Throwable
para imprimir el seguimiento de la pila al System.err
. Sin embargo, usted podría replace esto con su propio UncaughtExceptionHandler
que registra la excepción a LOG4J lugar:
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);
}
}
Si está utilizando un marco ejecutor a la que se pasa un objeto Runnable
, sus hilos probablemente tendrá su propio catch
bloque que impiden excepciones de llegar al controlador de excepciones no detectadas. Si se desea capturar Runtime
excepciones allí, una forma de hacerlo es envolver cada tarea en un envoltorio de registro, así:
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));
¿Quieres decir RuntimeExceptions "sin capturar"? –
Sí, quiero decir "no capturado" RuntimeExceptions – DkS