【问题标题】:Is it possible to find where a specific thrown exception could be caught in eclipse?是否有可能找到在 Eclipse 中可以捕获特定抛出异常的位置?
【发布时间】:2011-08-22 03:37:24
【问题描述】:

我正在尝试跟踪 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块
    • 如果捕获到异常,则评估流关闭
    • 如果没有,请重复 1。

注意事项

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

【问题讨论】:

    标签: java eclipse exception


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的 - 不值得尝试让 Jonas 启动并运行我 6 岁的应用程序...
    • 加上它不可重现的事实
    • @Stephen - 我不明白你对“jonas”的评论。你是说乔纳斯吗?这与您的问题有什么关系?
    • 是的 JOnAS - 在不熟悉的技术上设置一个过于复杂的遗留应用程序并进行调试等往往需要花费数小时的时间,而我的手动检查应该更正确,只需要 10-15m。只是不值得为我的大脑节省一些工作,仅此而已。
    【解决方案2】:

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

    【讨论】:

    • 他想要捕获异常的地方,直接或通过捕获异常的超类。
    【解决方案3】:

    动态分析呢?如果您可以调试程序,则可以从断点视图设置断点异常。这是带有“!”的小按钮和一个'J',只要你关心的异常被抛出,它就会中断。然后你就可以一步一步来看看它是在哪里被抓到的。

    当然它只会找到那些你可以通过调试实际练习的情况。

    【讨论】:

    • 是的;不幸的是,我的问题无法重现(我已在问题中添加了注释)
    【解决方案4】:

    您可以使用内存分析器,例如 jvisualvm/visualvm 并让它记录对象分配。当您预计所有资源都将关闭时,请检查活动对象并找出它们的构造位置。

    【讨论】:

    • 问题是它只能在一个客户环境(他们的故障转移系统)上重现一个大约 5 年历史的产品......
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2015-10-13
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多