2024年Clojure调查问卷中分享您的想法!

欢迎!请在关于页面查看有关此操作更多信息。

+3
错误

Java 7 的 try-with-resources 确保在 close 抛出异常并已存在其他从块体内泡起的异常时,不会丢失任何异常。这是通过将后者作为抑制附加到前者来实现的。抑制异常在 printStackTrace 中变得可见,这使得诊断涉及多次失败复杂问题的处理变得更容易。

似乎 with-open 不记录抑制异常。《code>close 处理在 finally 块中,如果堆栈已经展开,任何一个由 close 抛出的异常都将覆盖。

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

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

以下是对 with-open 支持抑制的一个实现:[查看代码](https://gist.github.com/mszajna/0ccbdfbd10927ff5d9517aaeb319952a)
它放弃了 finally 块,在高兴的情况下在 try 块外部关闭资源。在不幸的情况下,catch 块执行抑制记录并确保原始异常向上传播。

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

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

1 个解答

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