假设我正在异步发送一封电子邮件,并希望我的程序继续执行。到目前为止,我一直在使用future
s 进行此操作,但不幸的是,当电子邮件发送失败时,不会引发异常。
我知道取消引用未来会引发ExecutionException
,但取消引用会破坏这一点。
有没有更好的“开火即走”的方法,而不会丢失异常信息?
假设我正在异步发送一封电子邮件,并希望我的程序继续执行。到目前为止,我一直在使用future
s 进行此操作,但不幸的是,当电子邮件发送失败时,不会引发异常。
我知道取消引用未来会引发ExecutionException
,但取消引用会破坏这一点。
有没有更好的“开火即走”的方法,而不会丢失异常信息?
我会为此使用代理,使用处理程序函数来处理代理操作引发的异常:
(agent initial-state :error-handler handler-fn)
有关详细信息,请参阅(doc agent)
、(doc set-error-handler!)
、(doc set-error-mode!)
。initial-state
这里可能只是nil
,或者可能是一个保存一些日志数据的结构。
为了方便起见,您需要一个email
可与send
( send-off
, send-via
) 一起使用的函数:
(defn email [agent-state message] ...)
如果需要通知主线程出现问题,则需要注意通过某个通道进行的通信。(Java 队列是一种可能性,core.async的通道是另一种可能性。)处理程序函数然后可以通过该通道推送消息。
没有尝试...
(def foo (future (Thread/sleep 5000)
(throw (Exception. "bananas!"))
(Thread/sleep 5000)))
(future-done? foo)
;=> false
5秒后……
(future-done? foo)
;=> true
@foo
;=> Exception bananas! user/fn...
随着尝试...
(def bar (future (try (Thread/sleep 5000)
(throw (Exception. "bananas!"))
(Thread/sleep 5000)
(catch Exception e (println "Oh, " (.getMessage e))))))
(future-done? bar)
;=> false
5秒后……
;=>Oh, bananas!
@bar
;=> nil