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