我曾多次遇到这样的情况,期货中的异常很难追踪(并且已经在这里问了一个问题,为什么某些异常似乎永远不会发生,这个问题不是我的旧问题的欺骗)并决定尝试设置一个“默认未捕获的异常处理程序”。
但是我不能让它工作。我尝试使用 reify 并尝试使用代理。就好像什么事都没发生一样。
这是重现该问题的最小案例:
REPL> (Thread/setDefaultUncaughtExceptionHandler
(proxy [Thread$UncaughtExceptionHandler] []
(uncaughtException [thread throwable]
(do (println (-> throwable .getCause .getMessage))
; (error "whatever...") ; some 'timbre' logging if you have timbre
))))
nil
REPL> (future (do (Thread/sleep 100) (/ 0 0)))
#<core$future_call$reify__6267@c2909a1: :pending>
REPL>
我尝试了println,我尝试使用音色记录到一个文件,我试图吐出一个临时文件,我试图通过 deref'ing 来强制运行未来......显然,从未调用过默认的未捕获异常处理程序。
任何人都可以向我展示一个交互式/REPL 示例,说明一个工作的默认未捕获异常处理程序实际上捕获了一个异常吗?
作为一个额外的问题:一旦设置了默认的未捕获异常处理程序,是否有一种简单的方法可以“看到”它已设置?当您测试该功能并多次调用 setDefaultUncaughtExceptionHandler 时,REPL 中会发生什么?是否只考虑最后一个处理程序?