Java 7 的 try-with-resources 确保在执行 close
时,如果已经从块体中抛出另一个异常,则不会丢失异常。这是通过将被抑制的异常附加到前面的异常来完成的。在 printStackTrace
中使被抑制的异常可见,这使得诊断涉及多个失败的问题变得更加简单。
似乎 with-open
不记录被抑制的异常。close
在 finally
块中处理,并且如果堆栈已经开始回溯,任何由 close
抛出的异常都将覆盖。
另外,clojure.stacktrace
似乎完全忽略了被抑制的异常的存在。
为什么不支持被抑制的异常?或者这是 Java-7 之前的实现的遗留问题?是否会考虑添加这个支持呢?
以下是一个支持抑制的 with-open
的实现: https://gist.github.com/mszajna/0ccbdfbd10927ff5d9517aaeb319952a
它放弃了 finally 块,在快乐案例中将资源关闭在 try 块之外。在不幸的案例中,捕获块执行抑制记录并确保原始异常向上传播。
我可以想象另一个实现可能可以利用一部分状态来记录原始异常并可能保留 finally 块。
我在这个阶段还没有对 clojure.stacktrace
提出建议。我不确定这是一个新函数,还是应该将抑制的异常包含在 print-cause-trace
中。一方面,向后兼容性很重要;另一方面,这将对现有工具利用这个改进非常有益。