Clojure 期货和加载文件中的异常处理
我希望我的clojure程序有一个可以运行的脚本目录——每个脚本都是我在加载文件时执行的clojure代码。这将在将来发生,因此脚本将在自己的线程中运行 问题是我从未从脚本中看到任何错误消息。如果脚本失败,就无法知道出了什么问题。我假设这是因为在未来的线程中没有异常处理。我可以将异常处理放入脚本中,如下所示,它可以正常工作:Clojure 期货和加载文件中的异常处理,clojure,Clojure,我希望我的clojure程序有一个可以运行的脚本目录——每个脚本都是我在加载文件时执行的clojure代码。这将在将来发生,因此脚本将在自己的线程中运行 问题是我从未从脚本中看到任何错误消息。如果脚本失败,就无法知道出了什么问题。我假设这是因为在未来的线程中没有异常处理。我可以将异常处理放入脚本中,如下所示,它可以正常工作: ;; script code (try (println (/ 10 0)) (catch Exception e (println "Exception:
;; script code
(try
(println (/ 10 0))
(catch Exception e
(println "Exception: " (.getMessage e))))
但是,我更愿意将异常处理放在加载文件周围的更高级别上,这样就不必在脚本本身中进行异常处理:
(defn handleexes [f]
(try
(f)
(catch Exception e
(println "exception: " (.getMessage e)))))
(defn start-script-play [name]
(println "starting script: " name)
(let [f (future (handleexes (load-file (str "./scripts/" name))))]
(swap! scripts (fn [s] (assoc s name f)))))
我在这里调用handlexes中的加载文件。这不起作用——大部分情况下。当我运行一个包含自己的异常处理程序的脚本时,它确实可以工作,如上所述!如果脚本中没有异常处理程序,则什么都没有。维尔德
好吧,不管怎样,我的问题是这里到底发生了什么
- 期货市场是否真的不处理例外情况
- 当异常发生在加载文件中时,为什么没有被捕获李>
- 在这种情况下,如何捕获异常
deref
或@
)
如果在将来引发异常,尝试取消引用该将来将导致引发java.util.concurrent.ExecutionException
。此异常将封装将来抛出的任何内容
(try
(future (/ 10 0))
"done"
(catch Exception e
(str "caught " e)))
;=> "done"
(try
@(future (/ 10 0))
"done"
(catch Exception e
(str "caught " e)))
;=> "caught java.util.concurrent.ExecutionException: java.lang.ArithmeticException: Divide by zero"
有趣——但对我来说,这没有用,因为我从来没有计划去参考未来。我运行这些脚本纯粹是为了产生副作用,脚本可能会永远循环。在这种情况下,终止未来的线程将永远阻塞。我想我可以创造另一个未来来检查第一个未来!也许期货不是这里使用的解决方案。在这种情况下,经纪人可能会给你更多你想要的东西。除其他外,它们允许您指定任意错误处理程序。