2024 年 Clojure 情况调查!中分享您的想法。

欢迎!请查看关于页面,了解更多有关这个工作方式的信息。

+3 票数
错误

Java 7 try-with-resources 确保在没有其他异常从代码块体已 upheaving 的情况下,如果 close 抛出异常,则不会丢失任何异常。这是通过将后一个异常连接到前者作为抑制来实现的。抑制异常在 printStackTrace 中可见,使诊断涉及多个故障的复杂问题更容易。

似乎 with-open 不会记录抑制异常。在 finally 块中处理 close-ing,如果栈已开始 unwinding,则 close 抛出的任何异常将覆盖。

除此之外,clojure.stacktrace 看来完全忽略了抑制异常的存在。

为什么不支持抑制异常?或者这只是 Java-7 之前实现的遗留问题?您考虑添加此支持吗?

以下是支持抑制的 with-open 的一种实现:https://gist.github.com/mszajna/0ccbdfbd10927ff5d9517aaeb319952a
它忽略了 finally 块,在快乐的 case 中,将资源关闭于 try 块以外。在不幸的情况下,catch 块做抑制记录并确保原始异常向上传播。

我想象另一种实现可能会利用状态片段来记录原始异常并保持最后的区块。

在此阶段,我没有对 clojure.stacktrace 提出建议。我不确定这是否应该是一个新函数,或者应将抑制异常包含在 print-cause-trace 中。一方面,向后兼容性很好,另一方面,如果现有的工具可以充分利用这项改进,那就太棒了。

1 个答案

0 票数
用户头像 by
Jira问题标题仅捕获堆栈跟踪方面。我希望"with-open"部分不会在其他内容中丢失。
...