2011-03-01 92 views
9

我在我的Java应用程序中使用第三方库。该第三方库在每次应用程序启动时都会引发自定义的未捕获异常。该例外是无害的,仅用于第三方库内部的日志记录。由于没有捕获到这个异常,它会导致我的Eclipse IDE切换到调试透视图并在每次启动应用程序时都会暂停执行线程以通知我该问题。我必须手动告诉Eclipse忽略它,并且每次都要恢复调试。这非常烦人。为了解决这个问题,我无法更改第三方库。如何在Eclipse中忽略特定类型的未捕获异常?

有没有办法告诉Eclipse IDE忽略特定类型的未捕获异常?

我尝试了“步骤过滤”,但(我认为),因为自定义未捕获的异常不在堆栈跟踪中,所以它没有被从调试器中滤除。这是我第一次进入步骤过滤,所以我可能会错误地使用它。这是一个示例堆栈跟踪。

编辑:

jluzwick的变通使用我们自己的记录器禁用在Eclipse中的所有捕获的异常可以在技术上的工作后,观看捕获的异常,但它是不理想的,这是可能的,如果我们能错过的东西我们记录器坏了。

mazaneicha的解决方案似乎是在正确的轨道上,但我无法让它按照我想要的方式工作。这可能是由于我的用户错误。

jluzwick和mazaneicha都有可能解决这个问题,但Konstantin Komissarchik有“正确的”答案,因为这应该被推回到图书馆的创作者来解决。有时候技术解决方案并不是正确的。

回答

11

一个古老的线程,但想象我会添加一点。

至少在Eclipse的靛蓝:在调试Perspective->断点查看:

  1. 指定要暂停的例外(和潜在的子类)断点。这是通过单击“添加Java异常断点”完成的。一个J和一个感叹号的图标。
  2. 右键单击该断点,然后选择“断点属性”
  3. 进入“筛选”
  4. 指定要忽略的类或包。这会将它们添加到列表中。只是一定要取消他们来描绘它的排他性(没有在指定位置停车)

我倾向于使用这个,这样我可以作为一般的异常断点指定NullPointerException异常,但忽略从第三包党的图书馆。

+0

在我看来,这是比选定的更好的答案。我会注意到,除了“class”之外,我没有很好的运气,而是不得不求助于使用基于“包”的排除(Eclipse Galileo)。谢谢@Jeff! – 2013-06-21 12:56:33

+0

“一个古老的线程[...]”那么什么?当你为一次旧的讨论贡献一些有用的,有价值的东西时,不要再对你会得到的愚蠢的咒语感到惭愧。 – async 2014-12-05 10:27:07

2

我建议试着在代码中解决这个问题。在你的代码中找到你正在初始化这个库的地方,并捕获这个异常,而不是让它传播到堆栈中,这被认为是“正常”的行为。

+3

该库会在发生此异常时产生自己的线程池。我不能只是将库初始化封装在try/catch中。我无法控制发生异常的调用堆栈。 – Tansir1 2011-03-01 18:50:21

+1

然后你有问题。我建议联系图书馆提供商并报告错误。即使您将调试会话配置为忽略此问题,它仍将在运行时/生产中存在。您无法通知Eclipse运行时忽略未捕获的异常。他们直接进入错误日志。 – 2011-03-01 18:53:53

+4

这是拆分毛发,但您可以告诉Eclipse忽略所有未捕获的异常。我希望找到一种方法来忽略一种特定的类型。可以通过转到Windows-> Preferences-> Java-> Debug并取消选中“暂停对未捕获的异常执行”来完成。这是一个非常糟糕的主意,但它可以完成。我没有想到我有任何选择,但我认为在这里问问不会有什么伤害。谢谢您的帮助。 – Tansir1 2011-03-01 19:01:15

1

你有没有试过?

前往窗口 - >首选项 - > Java的>调试

在“暂停执行”取消选中“上挂起捕获的异常执行”

我不知道有一种方法来禁用特定的例外,但我可能是错的。有可能是一个插件。

+0

正如您所说,它不适用于特定的例外情况。这会导致Eclipse忽略它们。我仍然希望它能够抓住所有其他事情,以便在我自己的代码中找到问题。 – Tansir1 2011-03-01 19:05:11

+0

@ Tansir1你的未捕获的异常仍然会通过你的记录器报告,但正确吗?如果你注意到自己抛出的一个异常,你可以在抛出它的地方设置一个断点。 – jluzwick 2011-03-01 19:07:41

1

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

0

你听起来像你需要一个简单的尝试,赶上。

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

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

我希望你得到你所需要的,并且快乐的编码!

+0

查看Konstantin Komissarchik的回答。我无法控制调用堆栈,所以我不能像这样包装异常。它在第三方库中,而不是我自己的代码。 – Tansir1 2013-05-18 23:15:21