gpt4 book ai didi

exception - Clojure 异常未捕获

转载 作者:行者123 更新时间:2023-12-02 19:00:59 25 4
gpt4 key购买 nike

我正在学习 Clojure,我想创建一个像 Java 的 try-catch 一样工作的宏。如果抛出异常,则应返回该异常。否则,应返回结果。任何打开的资源也应该在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)如果我更改异常返回的格式,例如添加特定消息,则错误消息仍然没有改变。

非常感谢任何有助于找出问题所在的帮助!非常感谢您考虑我的请求。

最佳答案

(let [~value ~variable] 中,~variable 的计算结果为 (FileReader.(File."missing-file")),但那是在 try 之外。它会变成这样:

(let [s (FileReader. (File. "missing-file"))]
(try
(. s read)
. . .
))

let 移至 try 中,然后将 表达式 移至 let 主体中。


此外,与所有语言一样,(catch Exception e# e#) 几乎普遍都是一个坏主意。一旦发生任何非同寻常的事情,丢弃错误就会变成一场噩梦,因为你已经丢弃了问题的唯一证据。

关于exception - Clojure 异常未捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65583990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com