2

假设我正在异步发送一封电子邮件,并希望我的程序继续执行。到目前为止,我一直在使用futures 进行此操作,但不幸的是,当电子邮件发送失败时,不会引发异常。

我知道取消引用未来会引发ExecutionException,但取消引用会破坏这一点。

有没有更好的“开火即走”的方法,而不会丢失异常信息?

4

2 回答 2

4

我会为此使用代理,使用处理程序函数来处理代理操作引发的异常:

(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的通道是另一种可能性。)处理程序函数然后可以通过该通道推送消息。

于 2013-08-15T18:47:48.650 回答
3

没有尝试...

(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
于 2013-08-15T18:21:44.170 回答