是否有可能找到在eclipse中捕获特定抛出异常的位置?

时间:2011-05-10 04:08:18

标签: java eclipse exception

我试图跟踪IO资源泄漏,其中连接已打开但未必关闭:

try{ 
     ...
     urlConnection.connect();
     ...
     connectionResult.setResultInputStream(urlConnection.getInputStream());
     return connectionResult;

} catch (IOException e) {
     throw new ValidationException(e, new LocationData(submissionURL.toExternalForm(), -1, -1));
}

有没有办法找出ValidationException将通过调用层次结构捕获的位置?手动步骤如下:

  1. 调用含有方法的层次
  2. 对于每个来电者:
    • 分析周围的代码,找到try catch blocks
    • 如果发现异常,请评估流关闭
    • 如果没有,请重复1。
  3. 注释

    • 这是不可重复的;只有一个客户在其故障转移环境中遇到此问题 - 产品版本已有5年历史,之前从未显示过此类问题。
    • 我可以找到抛出异常的所有情况;我想找到这个特殊抛出的异常可以抓住的地方(包括catch Exception等)

5 个答案:

答案 0 :(得分:1)

Eclipse“开箱即用”肯定不支持这一点。他们可能是一个支持这个的Eclipse插件,但我没有听说过。 (这是你在实践中很少需要做的事情......所以没有理由去实现这个。)

代码分析的一种替代方法是破解代码以在您可以控制的某些情况下抛出异常,然后使用Java调试器来查看它实际被捕获的位置。

另一种选择可能是将自定义PMD规则混合在一起以识别相关的捕获量。我不认为这很简单......

答案 1 :(得分:0)

转到搜索 - > Java。在对话框中,您可以搜索构造函数并将“限制”设置为“引用”。这应该可以为您提供抛出异常的所有位置。

答案 2 :(得分:0)

动态分析怎么样?如果可以调试程序,则可以从“断点”视图设置“断点异常”。这是带有'!'的小按钮并且它上面有一个'J',它会在你抛出的异常被抛出的任何时候中断。然后你可以步骤查看它被捕获的位置。

当然,只会通过调试找到那些你可以练习的案例。

答案 3 :(得分:0)

您可以使用内存分析器,例如jvisualvm / visualvm,并对其进行日志对象分配。当您希望关闭所有资源时,请检查实时对象并找出它们的构建位置。

答案 4 :(得分:0)

错误296947 - [调用层次结构]查找catch块的异常位置 https://bugs.eclipse.org/bugs/show_bug.cgi?id=296947