2024 Clojure状态调查!中分享您的想法。

欢迎!请查阅关于页面获取更多有关该机制的信息。

0 投票
core.async

如果go或thread块抛出异常,Clojure中没有用于捕获和处理(或报告)该异常的机制。相反,它将传播到ThreadExcecutor,该Executor在执行其NO-OP afterExecute()方法后将其重新抛出,最终显示在System.err上

{quote}
thread "async-dispatch-32"中发生异常 java.lang.IllegalStateException: Fall down, go boom!

at flashiz.resources.orders$index.invoke(orders.clj:26)
at clojure.lang.Var.invoke(Var.java:411)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:617)
at io.aviso.rook$rook_dispatcher.invoke(rook.clj:225)
at flashiz.async$wrap_sync_handler$fn__9005.invoke(async.clj:34)
at flashiz.resources$authorize_async_rook_middleware$fn__9356$fn__9402$state_machine__3245__auto____9403$fn__9405.invoke(resources.clj:21)
at flashiz.resources$authorize_async_rook_middleware$fn__9356$fn__9402$state_machine__3245__auto____9403.invoke(resources.clj:21)
at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macros.clj:945)
at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(ioc_macros.clj:949)
at clojure.core.async.impl.ioc_macros$take_BANG_$fn__3261.invoke(ioc_macros.clj:958)
at clojure.core.async.impl.channels.ManyToManyChannel$fn__2256.invoke(channels.clj:80)
at clojure.lang.AFn.run(AFn.java:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

{quote}

如果在go/thread块中执行时用异常处理程序包装,并且将委托给默认函数来报告异常,会很好。我的目标是修改该函数以更优雅地报告异常或将它们写入持久日志文件。

3 答案

0 投票

由:alexmiller发表的评论

已应用了ASYNC-76的补丁。现在异常将流向线程的顶部,在那里可以由标准Thread未捕获异常处理机制或默认未捕获异常处理程序捕获,该处理程序可以为应用程序设置。还可能进一步更改以支持线程/go的异常处理。

0 投票

由:whilo发表的评论

我也反复遇到过这个问题,因此我实现了一个全面的错误处理策略作为core.async库:https://github.com/replikativ/superv.async

它有一定的局限性,例如,在 ClojureScript (cljs) 中,没有跨异步边界的动态绑定,因此需要在词法上携带监督者,我更倾向于采用默认的错误处理概念,遵循 Erlang 哲学,以构建基于 core.async 的可组合库。话虽如此,它仍然运行得相当好,并应为您提供安装日志监督器的必要手段。

0 投票
参考: https://clojure.atlassian.net/browse/ASYNC-61(由 hlewisship 报告)
...