Aradığınızı istediğinizden emin değilim, ancak iş parçacıklarını sonlandıran istisnalar için bir işleyici var. İş parçacığının hedefi tarafından açıkça yakalanmayan herhangi bir özel durum için bir işleyicidir.
Varsayılan "yakalanmamış özel durum işleyici", numaralı yığınta numaralı çağrıları yığın yığınını System.err
olarak yazdırmak için çağırır. Ancak, yapabilirsin replace yerine log4j için istisna kaydeder kendi UncaughtExceptionHandler
ile bu:
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);
}
}
bir infaz çerçeve kullanıyorsanız hangi bir Runnable
nesnesi geçirmek için, onun ipler muhtemelen önlemek kendi catch
blok var yakalanmamış istisna işleyicisine ulaşmanın istisnaları. Orada Runtime
durumları yakalamak istiyorsanız, yapmanın bir yolu böyle bir günlüğü ambalajında her görevi sarmak için geçerli:
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));
siz "yakalanmamış" RuntimeExceptions ifade ediyor mu? –
Evet "uncaught" demek istedim RuntimeExceptions – DkS