【问题标题】:How to ignore specific type of uncaught exception in Eclipse?如何忽略 Eclipse 中特定类型的未捕获异常?
【发布时间】:2011-07-06 17:51:31
【问题描述】:

我在我的 Java 应用程序中使用了第三方库。这个第三方库在每次应用程序启动时都会抛出一个自定义的未捕获异常。该异常是无害的,仅用于第三方库内部的日志记录目的。由于未捕获此异常,因此每次启动应用程序以通知我该问题时,我的 Eclipse IDE 都会切换到调试透视图并暂停线程执行。我必须手动告诉 Eclipse 忽略这一点,每次都恢复调试。这很烦人。我无法更改第三方库来解决此问题。

有没有办法告诉 Eclipse IDE 忽略特定类型的未捕获异常?

我尝试了“步骤过滤”,但(我认为)因为自定义未捕获异常不在堆栈跟踪中,所以它没有从调试器中过滤掉。这是我第一次尝试 Step Filtering,所以我可能用错了。这是一个示例堆栈跟踪。

Daemon Thread [Thread-13] (Suspended (exception CustomThirdPartyException)) 
    ThreadPoolExecutor$Worker.run() line: not available [local variables unavailable]   
    Thread.run() line: not available

编辑:

jluzwick 在 Eclipse 中禁用所有未捕获的异常后使用我们自己的记录器来监视未捕获的异常的工作在技术上是可行的,但它并不理想,如果我们的记录器损坏,我们可能会错过一些事情。

mazaneicha 的解决方案似乎在正确的轨道上,但我无法让它完全按照我想要的方式工作。这可能是由于我的用户错误。

jluzwick 和 mazaneicha 都有可能解决这个问题,但 Konstantin Komissarchik 有“正确”的答案,因为这应该被推回图书馆的创建者来解决。有时技术解决方案并不正确。

【问题讨论】:

    标签: java eclipse uncaught-exception


    【解决方案1】:

    一个旧线程,但我想我会添加一点。

    至少在 Eclipse Indigo 中:在 Debug Perspective->Breakpoints 视图中:

    1. 为要暂停的异常(以及可能的子类)指定断点。这是通过单击“添加 Java 异常断点”来完成的。一个由 J 和感叹号组成的图标。
    2. 右键单击断点并选择“断点属性”
    3. 转到“过滤”
    4. 指定要忽略的类或包。这会将它们添加到列表中。请务必取消选中它们以说明它是专有的(不要停在指定位置)

    我倾向于使用它,以便我可以将 NullPointerExceptions 指定为一般异常断点,但忽略来自第三方库的包。

    【讨论】:

    • 在我看来,这是一个比所选答案更好的答案。我会注意到我没有很好的运气排除“类”,而是不得不求助于使用基于“包”的排除(Eclipse Galileo)。谢谢@Jeff!
    • "一个旧线程 [...]" 那又怎样?当你为旧的讨论贡献一些有用、有价值的东西时,不要再在乎你可能会得到的愚蠢的抱怨。
    【解决方案2】:

    我建议尝试在代码中解决这个问题。在代码中找到您正在初始化此库的位置并捕获此异常,而不是让它在堆栈中传播,这不被视为“正常”行为。

    【讨论】:

    • 库在发生此异常的地方生成自己的线程池。我不能只将库初始化包装在 try/catch 中。我无法控制发生异常的调用堆栈。
    • 那你有问题了。我建议联系图书馆提供商并报告错误。即使您将调试会话配置为忽略此问题,它仍然会在运行时/生产中存在。您不能告诉 Eclipse 运行时忽略未捕获的异常。他们直接进入错误日志。
    • 这很麻烦,但您可以告诉 Eclipse 忽略所有未捕获的异常。我希望找到一种方法来忽略一种特定类型。可以通过转到 Windows->Preferences->Java->Debug 并取消选中“Suspend execution on uncaught exceptions”来完成。这是一个非常非常糟糕的主意,但可以做到。我不认为我有任何选择,但我认为在这里问不会有什么坏处。感谢您的帮助。
    【解决方案3】:

    你试过了吗?

    转到窗口->首选项->Java->调试

    在“暂停执行”下取消选中“在未捕获的异常上暂停执行”

    我不确定是否有针对特定异常禁用的方法,但我可能是错的。可能有一个插件可以做到这一点。

    【讨论】:

    • 正如你所说,它不适用于特定的例外情况。这会导致 Eclipse 忽略它们。我仍然希望它能够捕获其他所有内容,以便在我自己的代码中找到问题。
    • @Tansir1 您的未捕获异常仍将通过您的记录器报告,尽管正确吗?如果您发现自己的异常之一被抛出,您可以设置一个断点来抛出它。
    【解决方案4】:

    在 Debug 透视图的 Breakpoints 视图中,单击 Java Exception Breakpoints(带有小写字母 J 和感叹号 J! 的图标)。在出现的 Add Java Exception Breakpoint 窗口中,您可以找到烦人的异常并取消选中“Suspend on Uncaught Exception”框。

    【讨论】:

      【解决方案5】:

      听起来你需要一个简单的 try , catch。

       MyException e = new MyException;
       try {
             throw new e;
       } catch (MyException e) {
             e.printStackTrace();
       } 
      

      这将允许抛出异常,但会忽略并让程序继续。如果您希望将其记录到文件中,请使用 'PrintWriter.println(e.printStackTrace());'

      我希望你得到了你需要的东西,并且编码愉快!

      【讨论】:

      • 参见康斯坦丁·科米萨基克的答案。我无法控制调用堆栈,所以我不能像那样包装异常。它在第 3 方库中,而不是我自己的代码。
      【解决方案6】:

      为杰夫的回答做出贡献:

      在调试透视图中,右键单击挂起的线程并选择“排除异常位置”。这样 Eclipse 会将线程挂起的类添加到未捕获异常的过滤列表中。

      【讨论】:

        猜你喜欢
        • 2020-03-05
        • 2012-11-13
        • 2011-04-26
        • 2012-04-11
        • 1970-01-01
        • 2018-10-19
        • 2015-11-17
        • 2018-06-28
        • 2022-01-06
        相关资源
        最近更新 更多