2024 Clojure 状态调查 中分享您的想法!

欢迎!请参阅 关于 页面,了解更多关于此是如何工作的信息。

+3
错误

Java 7 的 try-with-resources 确保在执行 close 时,如果已经从块体中抛出另一个异常,则不会丢失异常。这是通过将被抑制的异常附加到前面的异常来完成的。在 printStackTrace 中使被抑制的异常可见,这使得诊断涉及多个失败的问题变得更加简单。

似乎 with-open 不记录被抑制的异常。closefinally 块中处理,并且如果堆栈已经开始回溯,任何由 close 抛出的异常都将覆盖。

另外,clojure.stacktrace 似乎完全忽略了被抑制的异常的存在。

为什么不支持被抑制的异常?或者这是 Java-7 之前的实现的遗留问题?是否会考虑添加这个支持呢?

以下是一个支持抑制的 with-open 的实现: https://gist.github.com/mszajna/0ccbdfbd10927ff5d9517aaeb319952a
它放弃了 finally 块,在快乐案例中将资源关闭在 try 块之外。在不幸的案例中,捕获块执行抑制记录并确保原始异常向上传播。

我可以想象另一个实现可能可以利用一部分状态来记录原始异常并可能保留 finally 块。

我在这个阶段还没有对 clojure.stacktrace 提出建议。我不确定这是一个新函数,还是应该将抑制的异常包含在 print-cause-trace 中。一方面,向后兼容性很重要;另一方面,这将对现有工具利用这个改进非常有益。

1 回答

0
by
by
Jira问题标题仅捕获堆栈跟踪方面。我希望with-open部分不会在杂乱中丢失。
...