Clojure 向承诺交付失败(例外)

Clojure 向承诺交付失败(例外),clojure,Clojure,我怎样才能使这个承诺的deref抛出异常,就像未来的主体抛出异常一样,未来也会引发异常 (let [p (promise)] (something-that-could-deliver-an-error p) @p) ; should explode with the delivered Exception 我目前正在考虑通过交付一个符合承诺的fn来实现这一点,但我怀疑有一种更惯用的方式来实现这一点 背景:我同时运行多个期货。如果其中任何一个错误,我想立即取消所有其他期货并输出错误。也

我怎样才能使这个承诺的
deref
抛出异常,就像未来的主体抛出异常一样,未来也会引发异常

(let [p (promise)]
  (something-that-could-deliver-an-error p)
  @p) ; should explode with the delivered Exception
我目前正在考虑通过交付一个符合承诺的
fn
来实现这一点,但我怀疑有一种更惯用的方式来实现这一点


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

Clojure的承诺没有“成功”和“失败”的单独概念,它们只是区分承诺是否实现。换句话说,当您遵从自定义异常时,无法获得Clojure核心承诺来抛出该异常

如果您同意走出标准库,您可以尝试改用来自流形的
deferred
对象:

延迟的
对象可以通过
成功
错误函数。前者的行为类似于
deliver
。后者允许您通过一个异常来实现承诺,如果延迟是
deref
'd,则会抛出该异常,但也可能被一些歧管的其他控制流函数“捕获”

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)

到目前为止,我已决定遵循erlang的标记元组方法,并以
[:ok value]
[:error exception]
的形式将内容交付给promise。