请在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
by

评论由:hiredman发表

如果能使用从ASYNC-198补丁应用的补丁进行测试那就太好了

0
by

评论由:leonoel发表

此补丁并未修复问题。
当前设计的问题在于,只能存储一个异常(在CURRENT-EXCEPTION槽中),因此当你需要处理多个异常时,最新的会覆盖之前的。

0
by

评论由:hiredman发表

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

finally块可以正常执行或
当处理异常时。因此,finally X 的行为有点像

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

之前,:try 代码生成一个单独的 finally 块,它会
尝试通过查看 CURRENT-EXCEPTION 的值来确定是否需要重新抛出异常
但这种情况在嵌套的 try/catch 中没有正确工作
的。

因此,现在 :try 代码生成两个 finally 块,一个用于重新抛出异常,一个不抛出
异常。重新抛出异常的块在异常帧栈中,不抛出异常的块将在 try 块体
的末尾以及每个异常处理器处跳跃。
该补丁还完全删除了 CURRENT-EXCEPTION,因为它仅用于让 finally 确定是否需要抛出或不需要。

异常

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