【问题标题】:Java: Global Exception HandlerJava:全局异常处理程序
【发布时间】:2010-12-05 15:08:12
【问题描述】:

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

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

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

马丁

【问题讨论】:

    标签: java exception exception-handling


    【解决方案1】:

    使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见 Rod Hilton 的“Global Exception Handling”博客文章。

    【讨论】:

      【解决方案2】:

      您可以设置the default UncaughtExceptionHandler ,当异常传播到整个系统中时,将使用它。

      【讨论】:

        【解决方案3】:

        DefaultUncaughtExceptionHandler 是正确的答案。几天前,Jeff Storeythis 位置向我透露了这一点。正如您所怀疑的,“手动”捕获的异常将永远不会被此处理程序捕获。但是我收到以下警告:

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

        当我根据良好实践检查了我的项目并推荐了带有PMD 插件的Java 编码风格Eclipse IDE。

        【讨论】:

        • "- 为了符合 J2EE,webapp 不应使用任何线程。" - 我不知道这一点。您的意思是 servlet 中的 service()(以及 doGet()、doPost() 等)方法不应该产生新线程吗?
        • 我不知道这意味着什么,因为我的应用程序不是基于网络的。我用谷歌搜索了一段时间,我还没有找到任何答案,我很害怕。除了像这样的警告或“变量名太短”或“变量名太长”,我创建 PMD 是一个很好的灵感来源。我强烈推荐它。
        • 我做了一些挖掘,显然你不能直接在 J2EE 中创建线程。我找到了几个链接:theserverside.com/discussions/thread.tss?thread_id=44353stackoverflow.com/questions/533783/…
        • 谢谢你,@Kolibri。
        • 没有严肃的网络应用程序只在一个线程上运行。 “webapp 不应使用任何线程”意味着您不应自己创建新线程,因为应用程序无法控制这些线程。使用预配置的线程池非常好。
        【解决方案4】:

        为澄清起见,对于独立 Java 应用程序或您确定有明确定义的线程入口点的实例,请使用 setDefaultUncaughtExceptionHandler。

        对于没有明确定义的线程入口点的情况,例如,当您在 Web 服务器或应用服务器上下文或其他框架中运行时,设置和拆卸是在您的代码之外处理的,看看该框架如何处理全局异常。通常,这些框架都有自己建立的全局异常处理程序,您可以参与其中,而不是定义它们。

        更详细的讨论请见http://metatations.com/2011/11/20/global-exception-handling-in-java/

        【讨论】:

          【解决方案5】:

          这是一个使用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)在每个线程的基础上完成

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-04-17
              • 2012-12-31
              • 2011-05-19
              • 2011-08-31
              • 1970-01-01
              • 1970-01-01
              • 2013-10-25
              相关资源
              最近更新 更多