在Java调试器中,如何忽略从不通过代码的异常

在Java调试器中,如何忽略从不通过代码的异常,java,exception,debugging,intellij-idea,Java,Exception,Debugging,Intellij Idea,我目前正在使用IntelliJ IDEA进行Java开发,但我也对针对其他IDE或调试Java代码的一般概念的答案感兴趣。因为这是我在许多IDE中错过的一个特性,所以我不确定在从其他语言转移调试习惯时是否错过了工作流概念 假设我在使用somelib.*中的框架类时,正在myapp.*中编写一些代码。典型的堆栈跟踪可能在任一包中启动,并可能在它们之间切换多次。假设我的代码中有bug,而库代码中没有bug,那么我也在进行调试。堆栈跟踪示例(仅显示类名): 通常,我对以下类型的异常不感兴趣,也不希望调

我目前正在使用IntelliJ IDEA进行Java开发,但我也对针对其他IDE或调试Java代码的一般概念的答案感兴趣。因为这是我在许多IDE中错过的一个特性,所以我不确定在从其他语言转移调试习惯时是否错过了工作流概念

假设我在使用
somelib.*
中的框架类时,正在
myapp.*
中编写一些代码。典型的堆栈跟踪可能在任一包中启动,并可能在它们之间切换多次。假设我的代码中有bug,而库代码中没有bug,那么我也在进行调试。堆栈跟踪示例(仅显示类名):

通常,我对以下类型的异常不感兴趣,也不希望调试器破坏它们:

  • somelib.B
    中抛出,在
    somelib.A
    中捕获。库代码正在抛出异常以处理库中有问题的状态或停止应用程序。在后一种情况下,我只对异常消息感兴趣,希望它能告诉我出了什么问题

  • somelib.D
    中抛出,在
    somelib.C
    中捕获。库代码可以使用异常作为一种逻辑形式,在出现问题的情况下尝试某个操作并采取替代路线,或者通过其他方式(例如,在适当的情况下返回空引用)通知我的代码

我感兴趣的例外类型:

  • somelib.C
    somelib.D
    中抛出,但未在
    somelib.C
    somelib.D
    中捕获。在这里,我希望调试器在
    myapp.Y
    中断行,在这里我从
    somelib.C
    调用代码

  • 被抛出
    myapp.X
    myapp.Y
    ,被捕获或未捕获。在这里,我希望调试器在抛出异常的那一行中断


IntelliJ IDEA为我提供了选择是否要在捕获或未捕获异常上中断的选项,或者同时选择两者,并将异常抛出的位置限制在一组类中。这些选项没有多大帮助,因为我通常希望在任何异常(无论捕获还是未捕获)上突破,只要我编写的代码最终处于抛出位置和捕获位置之间。。

使用Eclipse!使用Eclipse,您可以使用断点属性筛选异常应该停止调试的位置。

您可以创建两个异常断点:

  • 每当在
    myapp.*
    (捕获或未捕获)中出现异常时命中的异常断点。为此,请使用类过滤器(请参阅以获取类过滤器)
  • 每当“somelib.C1
    somelib.B”中存在未捕获的异常时命中的异常断点。再次使用类过滤器来限制断点

  • 似乎不可能以一种方便的方式完全做到我想要的。在提出这个问题时,我正在学习Java并将其教给我的同学,因此一个简单的解决方案是有利的

    但根据我目前的经验,使用以下方法似乎是合理的:

  • 在每个线程体周围放置
    catch(Trowable t)
    ,即
    Runnable.run()
    static main(String[])
    的顶层,并将这些“未捕获”异常记录到控制台中。
    • 需要注意的是,不要意外地用这些“catch all”处理程序捕获已检查的异常,而是将它们作为程序逻辑的一部分进行处理
  • 开始调试时,不要创建任何异常断点
  • 一旦异常被记录到控制台,就为其创建一个异常断点,并尝试使其再次被抛出。
    • 这应该只发生未经检查的异常(即
      RuntimeException
      的子类),因为其他异常无论如何都必须被显式捕获和处理
    • 由于捕获和处理未检查的异常通常不是程序逻辑的一部分,因此在抛出异常的位置创建这些没有约束的异常断点不应捕获任何“误报”

  • 另一种方法是跳过最后两个步骤,而是为
    RuntimeException
    创建一个异常断点。但这在捕获作为程序逻辑一部分捕获的异常方面有更高的变化。

    在IntelliJ中,您可以在
    异常
    断点上定义
    条件。该条件只是在命中断点时执行的Java代码,因此在条件检查期间异常对象将在范围内。您可以调用异常上的
    getStackTrace()
    ,并通过查看堆栈上的每个帧来确定它是否是您感兴趣的异常。如果您不感兴趣,那么您的条件将失败,断点将被跳过。

    我忘了提到:没有Eclipse!事实上,我和Eclipse相处得不是很好,但我要看看它的Java调试器。谢谢我已经在IntelliJ IDEA论坛上直接回复了这个问题,一旦有任何进展,我会立即报告:被扔进
    somelib.C
    和被困在
    somelib.D
    中,你的意思是相反的吗?@PiotrDobrogost是的,我做到了!谢谢在Visual Studio中,此功能被实现并称为“仅我的代码”:……我看到有人已经在jetbrains上将此功能发布到您的问题中:1.:据我所知,类筛选器将只匹配所选类中由throw语句引发的异常,而不是,例如。,如果所选类访问超出范围的
    java.util.List
    索引。2.:仅当捕获特定异常的库代码未调用我的代码时,即调用函数时,此选项才有效
    somelib.D (current stack frame)
    somelib.C
    myapp.Y
    myapp.X
    somelib.B
    somelib.A