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

Feu*_*mel 6 java debugging exception intellij-idea

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

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

somelib.D (current stack frame)
somelib.C
myapp.Y
myapp.X
somelib.B
somelib.A
Run Code Online (Sandbox Code Playgroud)

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

  • 投掷somelib.B并陷入其中somelib.A.库代码抛出异常以处理库内的有问题状态或停止应用程序.在后一种情况下,我只对异常消息感兴趣,希望告诉我什么是错的.

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

我感兴趣的例外类型:

  • 投掷somelib.C或未somelib.D陷入somelib.Csomelib.D.在这里,我希望调试器myapp.Y在我调用代码的地方中断somelib.C.

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

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

Feu*_*mel 0

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

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

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

另一种方法是跳过最后两个步骤,而是为RuntimeException. 但这对于捕获作为程序逻辑的一部分捕获的异常有更高的变化。