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
中。一方面,向后兼容性很好,另一方面,它将非常有益于现有工具利用这个改进。