如何在Eclipse中忽略特定类型的未捕获异常?

11
我在我的Java应用程序中使用第三方库。该第三方库在每次应用程序启动时抛出一个自定义未捕获异常。该异常对内部仅用于日志记录目的,是无害的。由于这个异常未被捕获,每次启动应用程序时,它会导致我的Eclipse IDE切换到调试视图并挂起线程执行以通知我出现了问题。我必须手动告诉Eclipse忽略这个问题并继续调试。这非常烦人。我不能更改第三方库以解决此问题。
有没有办法告诉Eclipse IDE忽略特定类型的未捕获异常?
我尝试了“步进过滤”,但(我认为)由于自定义未捕获异常不在堆栈跟踪中,因此它没有被从调试器中过滤出来。这是我第一次尝试步进过滤,所以可能使用不正确。以下是一个示例堆栈跟踪。
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给出了“正确”的答案,即应该将此问题反馈给库的创建者进行修复。有时候,技术解决方案并不是最合适的。

6个回答

14

这是一个旧帖子,但我想要添加一些内容。

至少在Eclipse Indigo版本中,在Debug透视图->断点视图中:

  1. 指定您想要暂停的异常(以及可能的子类)的断点。通过点击“添加Java异常断点”,完成此操作。这个图标是字母J和一个感叹号。
  2. 右键单击断点并选择“断点属性”
  3. 进入“过滤”
  4. 指定您想要忽略的类或包。这将把它们添加到列表中。只需确保取消选中它们即可表示它是排他的(不要停在指定位置)

我倾向于使用这个功能来指定NullPointerExceptions作为一般异常断点,但忽略来自第三方库的包。


在我看来,这个答案比被选中的那个更好。我要注意一下,我没有很好的运气通过“class”进行排除,而是不得不使用基于“package”的排除(Eclipse Galileo)。谢谢@Jeff! - Matt Felzani
一个旧的帖子怎么了?别再在意那些愚蠢的抱怨了,当你为一个老话题做出有用、有价值的贡献时,就不要再理会它们。 - async

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

3
该库会生成自己的线程池,异常就是在这个线程池中发生的。我不能只是在 try/catch 中包装库初始化。我无法控制异常发生时的调用堆栈。 - Tansir1
1
那么你就有一个问题了。我建议联系库提供者并报告错误。即使您配置调试会话以忽略此问题,在运行时/生产中仍将存在该问题。您无法告诉Eclipse运行时忽略未捕获的异常。它们直接进入错误日志。 - Konstantin Komissarchik
4
这有点太过苛刻,但你可以告诉Eclipse忽略所有未捕获的异常。我希望找到一种方式来忽略一个特定类型的异常。可以通过转到“Windows->Preferences->Java->Debug”并取消选中“在未捕获的异常上中止执行”来实现。这是一个非常糟糕的想法,但它是可行的。我以为我没有其他选择,但问问这里也无妨。谢谢您的帮助。 - Tansir1

1

你试过这个吗?

前往Window->Preferences->Java->Debug

在"Suspend Execution"下取消选中"在未捕获的异常时暂停执行"

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


正如你所说,它不能针对特定的异常进行工作。这会导致Eclipse忽略所有异常。我仍然希望它能够捕获其他所有异常,以便在我的代码中找到问题。 - Tansir1
@Tansir1,您的未捕获异常仍将通过记录器报告,对吗?如果你注意到自己抛出了异常,可以在它被抛出的地方设置一个断点。 - jluzwick

1
在调试视图中,断点视图,单击Java异常断点(带有小写字母J和感叹号的图标,J!)。在出现的添加Java异常断点窗口中,您可以找到烦人的异常并取消选中“未捕获异常时暂停”框。

1

对Jeff的回答进行补充:

在调试模式下,右键点击暂停的线程,选择“排除异常位置”。这样,Eclipse会将线程暂停在的类添加到未捕获异常的过滤列表中。


0

你好像需要一个简单的 try,catch。

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

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

希望您得到所需的内容,编码愉快!


请参见Konstantin Komissarchik的回答中的注释。我无法控制调用堆栈,因此无法像那样包装异常。它在第三方库中,而不是我的代码中。 - Tansir1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接