Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 期货和加载文件中的异常处理_Clojure - Fatal编程技术网

Clojure 期货和加载文件中的异常处理

Clojure 期货和加载文件中的异常处理,clojure,Clojure,我希望我的clojure程序有一个可以运行的脚本目录——每个脚本都是我在加载文件时执行的clojure代码。这将在将来发生,因此脚本将在自己的线程中运行 问题是我从未从脚本中看到任何错误消息。如果脚本失败,就无法知道出了什么问题。我假设这是因为在未来的线程中没有异常处理。我可以将异常处理放入脚本中,如下所示,它可以正常工作: ;; script code (try (println (/ 10 0)) (catch Exception e (println "Exception:

我希望我的clojure程序有一个可以运行的脚本目录——每个脚本都是我在加载文件时执行的clojure代码。这将在将来发生,因此脚本将在自己的线程中运行

问题是我从未从脚本中看到任何错误消息。如果脚本失败,就无法知道出了什么问题。我假设这是因为在未来的线程中没有异常处理。我可以将异常处理放入脚本中,如下所示,它可以正常工作:

;; 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"

有趣——但对我来说,这没有用,因为我从来没有计划去参考未来。我运行这些脚本纯粹是为了产生副作用,脚本可能会永远循环。在这种情况下,终止未来的线程将永远阻塞。我想我可以创造另一个未来来检查第一个未来!也许期货不是这里使用的解决方案。在这种情况下,经纪人可能会给你更多你想要的东西。除其他外,它们允许您指定任意错误处理程序。