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。