Java:全局异常处理程序

时间:2009-10-10 17:06:52

标签: java exception exception-handling

有没有办法在Java中创建全局异常处理程序。我想这样用:

"When an exception is thrown somewhere in the WHOLE program, exit."

处理程序可能无法捕获try-catch正文中抛出的异常。

马亭

6 个答案:

答案 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 Storeythis位置向我透露了这一点。正如您所怀疑的那样,“手动”捕获的异常永远不会被此处理程序捕获。但是我收到了以下警告:

** - 为了符合J2EE,webapp不应该使用任何线程。**

当我使用PMD IDE的Eclipse插件检查我的项目与良好实践并推荐使用java编码样式时。

答案 5 :(得分:0)

Threads.setDefaultUncaughtExceptionHandler()有效,但并非在所有情况下都有效。例如,我在创建Swing小部件之前在main()中使用它,并且它在Swing创建的线程中工作,例如AWT事件线程或SwingWorker线程。

遗憾的是,使用JavaSE 1.6时,使用LDAP URL时,它对javax.naming.spi.NamingManager.getInitialContext()创建的线程没有任何影响。毫无疑问还有其他例外。