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 的行为有点像

(try (let [link: r (code)] (X) r) (catch Throwable t (X) (throw t)))

之前,:try 代码生成一个单独的 finally 块,它
试图确定是否需要重新抛出异常,但这在
某些嵌套 try/catch 的情况下没有正确工作

因此,现在 :try 代码生成两个 finally 块,一个用于重新抛出
,另一个不重新抛出。重新抛出块位于异常帧
堆栈上,而不重新抛出块则在体和每个异常处理程序的末尾跳转。

该补丁还完全删除了 CURRENT-EXCEPTION,因为它仅用于 finally 确定是否需要抛出

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