Java:全局exception处理程序

有没有办法在Java中创build一个全局exception处理程序? 我想用这样的:

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

处理程序可能无法捕获在try-catch主体中抛出的exception。

马亭

使用Thread.setDefaultUncaughtExceptionHandler 。 请参阅Rod Hilton的“ 全局例外处理 ”博客文章。

您可以设置默认的UncaughtExceptionHandler ,当exception在整个系统中未捕获时使用。

这是一个使用Logback处理任何未捕获的exception的例子:

 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)

为了说明起见,请将setDefaultUncaughtExceptionHandler用于独立Java应用程序,或者对于您确定具有定义好的Thread的入口点的情况。

例如,如果您没有为Thread定义明确的入口点,例如,当您在Web服务器或应用服务器上下文或其他框架中运行安装程序和拆卸代码以外的代码时,请参阅该框架如何处理全局exception。 通常,这些框架拥有自己build立的全局exception处理程序,您将成为参与者而不是定义。

有关更详细的讨论,请参阅http://metatations.com/2011/11/20/global-exception-handling-in-java/

DefaultUncaughtExceptionHandler是正确的答案。 几天前, Jeff Storey在这个位置向我透露了这个消息 。 如你所怀疑的,“手动”捕获的exception将永远不会被这个处理程序捕获。 不过,我得到以下警告:

** – 要符合J2EE,一个Web应用程序不应该使用任何线程。**

当我检查我的项目反对良好的做法,并build议与Eclipse IDE的PMD插件Java编码风格。

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

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