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

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

0
core.async
内层try异常处理会清除外层try的异常状态,使其成功返回而不是重新抛出。
在下述代码片段中,虽然有应该视为死代码的prn被执行。

(let [chan (a/chan)
      npe! nil]
  (a/go
    (try (npe!)
         (finally
           (try (a/>! chan (npe!))
                (catch NullPointerException _))))
    (prn "this is fine.")))

4 个答案

0

评论者:hiredman

如果您能在应用了ASYNC-198补丁的情况下测试这将很棒

0

评论者:leonoel

这个补丁没有解决这个问题。
当前设计的问题在于只能存储一个异常(在CURRENT-EXCEPTION槽中),因此当您需要处理多个异常时,最新的会覆盖前一个。

0

评论者:hiredman

0002-async-220-generate-two-finally-blocks.patch
基于ASYNC-198的补丁之上

finally块可以通过正常执行流程或
处理异常来进入,因此一个finally X的行为有点像

(尝试(let (link: r (code)) (X) r) (catch Throwable t (X) (throw t)))

之前,:try 代码生成一个单独的 finally 块,它
试图确定是否需要重新抛出异常,方法是通过
查看 CURRENT-EXCEPTION 的值,但这在某些嵌套的 try/catch 中
不正确地工作。

因此,现在 :try 代码生成两个 finally 块,一个是重新抛出
,一个是不会重新抛出。重新抛出块的堆栈位于异常帧
栈上,不在重新抛出块跳转到 body 和每个异常处理的末尾。
the patch also gets rid of CURRENT-EXCEPTION entirely, as it was only used by finally to determine if it needed to throw or not

the patch also gets rid of CURRENT-EXCEPTION entirely, as it was only used by finally to determine if it needed to throw or not

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