我有几次遇到这样的情况:期货中的异常情况很难被追查(并且在这里已经问过一个问题,为什么某些异常情况似乎永远不会发生,并且这个问题不是我以前的问题的重复),因此决定尝试设置“默认未捕获的异常处理程序”。
但是我不能使它工作。 我尝试使用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 ,尝试了使用音色记录到文件,尝试了将其吐到临时文件,并尝试通过取消引用来强制将来运行...显然,从未调用默认的未捕获异常处理程序。
谁能给我展示一个交互式/ REPL示例,它说明一个正在工作的默认未捕获异常处理程序实际上是在捕获异常吗?
一个额外的问题是:一旦设置了默认的未捕获异常处理程序,是否有一种简单的方法可以“看到”它的设置? 当您测试该功能并多次调用setDefaultUncaughtExceptionHandler时,REPL中会发生什么? 仅考虑最后一个处理程序吗?