【发布时间】:2010-12-05 15:08:12
【问题描述】:
有没有办法在 Java 中创建一个全局异常处理程序。我想这样使用:
"When an exception is thrown somewhere in the WHOLE program, exit."
处理程序可能无法捕获try-catch 正文中抛出的异常。
马丁
【问题讨论】:
标签: java exception exception-handling
有没有办法在 Java 中创建一个全局异常处理程序。我想这样使用:
"When an exception is thrown somewhere in the WHOLE program, exit."
处理程序可能无法捕获try-catch 正文中抛出的异常。
马丁
【问题讨论】:
标签: java exception exception-handling
使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见 Rod Hilton 的“Global Exception Handling”博客文章。
【讨论】:
您可以设置the default UncaughtExceptionHandler ,当异常传播到整个系统中时,将使用它。
【讨论】:
DefaultUncaughtExceptionHandler 是正确的答案。几天前,Jeff Storey 在this 位置向我透露了这一点。正如您所怀疑的,“手动”捕获的异常将永远不会被此处理程序捕获。但是我收到以下警告:
**- 为了符合 J2EE,webapp 不应使用任何线程。**
【讨论】:
为澄清起见,对于独立 Java 应用程序或您确定有明确定义的线程入口点的实例,请使用 setDefaultUncaughtExceptionHandler。
对于没有明确定义的线程入口点的情况,例如,当您在 Web 服务器或应用服务器上下文或其他框架中运行时,设置和拆卸是在您的代码之外处理的,看看该框架如何处理全局异常。通常,这些框架都有自己建立的全局异常处理程序,您可以参与其中,而不是定义它们。
更详细的讨论请见http://metatations.com/2011/11/20/global-exception-handling-in-java/
【讨论】:
这是一个使用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)在每个线程的基础上完成
【讨论】:
Threads.setDefaultUncaughtExceptionHandler() 有效,但并非在所有情况下都有效。例如,我在创建 Swing 小部件之前在 main() 中使用它,它在 Swing 创建的线程中工作,例如 AWT 事件线程或 SwingWorker 线程。
遗憾的是,当使用 JavaSE 1.6 使用 LDAP URL 时,它对 javax.naming.spi.NamingManager.getInitialContext() 创建的线程没有任何影响。毫无疑问,还有其他例外。
【讨论】: