Java 中有没有一种方法可以创建一个全局的异常处理器?我希望可以这样使用:
"When an exception is thrown somewhere in the WHOLE program, exit."
处理程序可能无法捕获在try-catch
块中抛出的异常。马尔廷
这是一个示例,使用Logback来处理所有未捕获的异常:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e);
System.exit(1);
}
});
您还可以使用Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
方法对每个线程进行单独设置。
为了澄清,对于独立的Java应用程序或确信线程有明确定义入口点的情况,请使用setDefaultUncaughtExceptionHandler。
对于没有明确定义入口点的情况,例如在Web服务器、应用服务器上下文或其他框架中运行时,设置和拆卸由代码之外的处理程序处理,请查看该框架如何处理全局异常。通常,这些框架具有自己已建立的全局异常处理程序,您成为其中的参与者,而不是定义。
有关更详细的讨论,请参见http://metatations.com/2011/11/20/global-exception-handling-in-java/。
DefaultUncaughtExceptionHandler是正确的答案。 几天前,Jeff Storey在this地点向我透露了这一点。 正如您所怀疑的那样,“手动”捕获的异常永远不会被此处理程序捕获。 但是我收到了以下警告:
**- 为了符合J2EE标准,Web应用程序不应使用任何线程。**
Threads.setDefaultUncaughtExceptionHandler() 可以使用,但并非所有情况都适用。例如,在创建 Swing 小部件之前,我在 main() 中使用它,并且它可以在由 Swing 创建的线程(例如 AWT 事件线程或 SwingWorker 线程)中工作。
不幸的是,当使用 LDAP URL 时,javax.naming.spi.NamingManager.getInitialContext() 创建的线程没有任何效果,使用 JavaSE 1.6。毫无疑问还有其他例外情况。
setUncaughtExceptionHandler
? - wonsucNamingManagerGetInitialContext()
创建的线程。或者我当时不知道它。) - Jeff Learman