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
中。一方面,向后兼容性很好,另一方面,如果现有的工具可以充分利用这项改进,那就太棒了。