未捕获 Clojure 异常
Clojure exception not caught
我正在学习 Clojure,我想创建一个像 Java 的 try-catch 一样工作的宏。
如果抛出异常,则异常应该被 returned。否则,结果应该是 returned。
任何打开的资源也应该在 finally 部分关闭(不使用 with-open)。但是,我确实有一个问题,除了没有被抓住之外,我不知道如何解决。如有任何帮助或建议,我们将不胜感激!
这是我的代码:
(defmacro my-try
([expression]
`(try
~expression
(catch Exception e# e#)
)
)
([[value variable] expression]
`(let [~value ~variable]
(try
~expression
(catch Exception e# e#)
(finally (if (instance? java.io.Closeable ~value) (.close ~value)))
)
)
)
)
当我尝试打开并读取一个不存在的文件时:
(def v (my-try [s (FileReader. (File. "missing-file"))] (. s read)))
(println v)
我收到以下错误:
Execution error (FileNotFoundException) at java.io.FileInputStream/open0 (FileInputStream.java:-2).
missing-file (Det går inte att hitta filen)
我怀疑这个错误消息是一个未捕获的异常,因为(1)它不遵循其他异常的结构,以及(2)如果我改变异常的格式return,比如添加一个特定的消息,错误消息仍然没有改变。
非常感谢任何有助于找出问题所在的帮助!
非常感谢您考虑我的请求。
在 (let [~value ~variable]
中,~variable
的计算结果为 (FileReader. (File. "missing-file"))
,但它在 try
之外。它会变成这样:
(let [s (FileReader. (File. "missing-file"))]
(try
(. s read)
. . .
))
将 let
移到 try
中,然后将 expression
移到 let
正文中。
此外,与所有语言一样,(catch Exception e# e#)
几乎普遍不是一个好主意。一旦发生任何不平凡的事情,丢弃错误就会变成一场噩梦,因为您已经丢弃了问题的唯一证据。
我正在学习 Clojure,我想创建一个像 Java 的 try-catch 一样工作的宏。 如果抛出异常,则异常应该被 returned。否则,结果应该是 returned。 任何打开的资源也应该在 finally 部分关闭(不使用 with-open)。但是,我确实有一个问题,除了没有被抓住之外,我不知道如何解决。如有任何帮助或建议,我们将不胜感激!
这是我的代码:
(defmacro my-try
([expression]
`(try
~expression
(catch Exception e# e#)
)
)
([[value variable] expression]
`(let [~value ~variable]
(try
~expression
(catch Exception e# e#)
(finally (if (instance? java.io.Closeable ~value) (.close ~value)))
)
)
)
)
当我尝试打开并读取一个不存在的文件时:
(def v (my-try [s (FileReader. (File. "missing-file"))] (. s read)))
(println v)
我收到以下错误:
Execution error (FileNotFoundException) at java.io.FileInputStream/open0 (FileInputStream.java:-2).
missing-file (Det går inte att hitta filen)
我怀疑这个错误消息是一个未捕获的异常,因为(1)它不遵循其他异常的结构,以及(2)如果我改变异常的格式return,比如添加一个特定的消息,错误消息仍然没有改变。
非常感谢任何有助于找出问题所在的帮助! 非常感谢您考虑我的请求。
在 (let [~value ~variable]
中,~variable
的计算结果为 (FileReader. (File. "missing-file"))
,但它在 try
之外。它会变成这样:
(let [s (FileReader. (File. "missing-file"))]
(try
(. s read)
. . .
))
将 let
移到 try
中,然后将 expression
移到 let
正文中。
此外,与所有语言一样,(catch Exception e# e#)
几乎普遍不是一个好主意。一旦发生任何不平凡的事情,丢弃错误就会变成一场噩梦,因为您已经丢弃了问题的唯一证据。