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

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

假设我在myapp.*编写了一些代码myapp.*使用somelib.*框架类somelib.* 。 典型的堆栈跟踪可以从任一包开始,并且可以在它们之间切换多次。 我们也说我在假设我的代码中存在错误并且库代码中没有任何错误的情况下进行调试。 示例堆栈跟踪(仅显示类名称):

 somelib.D (current stack frame) somelib.C myapp.Y myapp.X somelib.B somelib.A 

通常,我对以下类型的exception不感兴趣,并且不希望调试器打破它们:

  • somelib.B抛出并在somelib.B捕获。 库代码抛出exception以处理库内的有问题状态或停止应用程序。 在后一种情况下,我只对exception消息感兴趣,希望告诉我什么是错的。

  • somelib.D抛出并在somelib.D捕获。 库代码可以使用exception作为逻辑forms,其中尝试某个动作,并且在出现问题时采用替代路径,或者通过其他方式通过问题通知我的代码(例如,在适当的情况下返回空引用) 。

我感兴趣的例外类型:

  • somelib.Csomelib.D抛出,而不是在somelib.Csomelib.D 。 在这里,我希望调试器在myapp.Y中断行,我从somelib.C调用代码。

  • myapp.Xmyapp.Y抛出,无论是捕获还是未捕获。 在这里,我希望调试器在引发exception的行中断。

IntelliJ IDEA为我提供了选择我想要在捕获或未捕获的exception或两者上中断的选项,并限制将exception抛出到一组类的位置。 这些选项并没有多大帮助,因为我通常想要打破任何exception,无论是抓住还是未捕获,只要我写的代码介于它被抛出的位置和它最终被捕获的位置之间

您可以创建两个exceptionbreakpionts:

  1. 每当myapp.*出现exception时myapp.*的exception断点myapp.* (捕获或未捕获)。 使用类filter来实现此目的(请在此处查看类filter)。
  2. 每当’somelib.C1 or somelib.B`中出现未捕获的exception时都会触发的exception断点。 再次使用类filter来限制断点。

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

似乎不可能以方便的方式完全按照我的意愿行事。 在这个问题发生的时候,我正在学习Java并将其教给我的同学们,所以一个简单的解决方案本来是有利的。

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

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

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

使用Eclipse! 使用Eclipse,您可以使用断点属性过滤exception应停止调试的位置。