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

欢迎!有关此如何工作的更多信息,请参阅关于页面。

0
core.async

如果go或thread块抛出异常,Clojure中没有任何机制可以捕获并处理(或报告)该异常。相反,它将向上传播到ThreadExcecutor,该线程调用其NO-OP afterExecute()方法并重新抛出,最终在System.err中显示。

{quote}
thread "async-dispatch-32"中的异常:java.lang.IllegalStateException:坠落,爆炸!

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](https://github.com/replikativ/superv.async)

它具有一定的局限性,例如在Cljs中异步边界之间没有动态绑定,所以需要按词法传递supervisor,而且我更倾向于使用类似于Erlang哲学的默认错误处理概念,以构建在core.async之上的可组合库。话虽如此,它工作得相当好,应该为你提供安装日志supervisor的必要手段。

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