gpt4 book ai didi

clojure - 将失败(异常)传递给 promise

转载 作者:行者123 更新时间:2023-12-02 04:50:36 25 4
gpt4 key购买 nike

我怎样才能让这个 promise 的 deref 抛出一个异常,就像 future 的主体抛出一个异常一样, future 也会导致异常?

(let [p (promise)]
(something-that-could-deliver-an-error p)
@p) ; should explode with the delivered Exception

我目前正在考虑通过向 promise 传递 fn 来做到这一点,但我怀疑有更惯用的方法来做到这一点。

背景:我同时运行多个 future 。如果其中任何一个出错,我想立即取消所有其他 future 并输出错误。也许有更好的方法?

最佳答案

Clojure 的promise 没有“成功”和“失败”的独立概念,只是区分一个promise 是否已经实现。换句话说,当您尊重它时,无法获得 Clojure 核心 promise 以抛出自定义异常。

如果您可以在标准库之外使用,您可以尝试使用 Manifold 中的 deferred 对象:

http://aleph.io/manifold/deferreds.html

deferred 对象可以通过 success!error! 函数实现。前者的行为类似于 deliver。后者允许您以异常实现 promise ,如果延迟被 deref 抛出,但也可以被 Manifold 的一些其他控制流函数“捕获”。

user=> (require '[manifold.deferred :as d])
nil
user=> (def my-deferred-value (d/deferred))
#'user/my-deferred-value
user=> (d/error! my-deferred-value (ex-info "Error!" {:failed true}))
true
user=> @my-deferred-value
ExceptionInfo Error! clojure.core/ex-info (core.clj:4617)

关于clojure - 将失败(异常)传递给 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com