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

ljsrvy3e  于 2022-09-20  发布在  Java
关注(0)|答案(4)|浏览(155)
  • 我目前正在使用IntelliJ IDEA进行Java开发,但我也对针对其他IDE或调试Java代码的一般概念的答案感兴趣。因为这是我在许多IDE中遗漏的一个功能,所以我不确定在从其他语言迁移我的调试习惯时是否遗漏了工作流概念。

假设我正在用myapp.*编写一些代码,同时使用somelib.*中的框架类。典型的堆栈跟踪可能在任一包中开始,并可能在它们之间切换多次。还可以说,我在调试时假定我的代码中有错误,而库代码中没有任何错误。堆栈跟踪示例(仅显示类名):

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

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

  • somelib.B中抛出,在somelib.A中捕获。库代码正在引发异常以处理库中的问题状态或停止应用程序。在后一种情况下,我只对异常消息感兴趣,希望它能告诉我哪里出了问题。
  • somelib.D中抛出,在somelib.C中捕获。库代码可以使用异常作为一种逻辑形式,其中在出现问题的情况下尝试某一操作并且采取替代路线,或者在通过其他方式(例如,在适当的地方返回空引用)由问题通知我的代码的情况下。

我感兴趣的例外类型:

  • somelib.Csomelib.D中抛出,在somelib.Csomelib.D中未捕获。在这里,我希望调试器在myapp.Y中我从somelib.C调用代码的那一行中断。
  • 抛入myapp.Xmyapp.Y,捕获或未捕获。在这里,我希望调试器在抛出异常的行上中断。

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

xjreopfe

xjreopfe1#

您可以创建两个例外断点:

1.每当myapp.*中有异常(已捕获或未捕获)时命中的异常断点。为此,请使用Class Filter(查看here了解类过滤器)。
1.一个异常断点,只要在其中的一个中有未捕获的异常就会命中。再次使用类筛选器来限制断点。

syqv5f0l

syqv5f0l2#

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

6yt4nkrj

6yt4nkrj3#

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

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

  • catch (Trowable t)放在每个线程体周围,即在Runnable.run()static main(String[])的顶层,并将这些未捕获的异常记录到控制台。

  • 需要注意的是,不要意外地使用这些“包罗万象”的处理程序捕获已检查的异常,而是要将它们作为程序逻辑的一部分进行处理。

  • 开始调试时,不要创建任何异常断点。

  • 在控制台记录异常后,立即为其创建异常断点,并尝试再次抛出异常。

  • 这应该只发生未检查的异常(即RuntimeException的子类),因为无论如何都必须显式捕获和处理其他异常。

  • 由于捕获和处理未检查的异常通常不是程序逻辑的一部分,因此创建这些异常断点而不对抛出位置进行约束应该不会捕获任何“误报”。

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

pzfprimi

pzfprimi4#

使用Eclipse!使用Eclipse,您可以使用断点属性过滤异常应该在哪里停止调试。

相关问题