Clojure 如何分配nil而不是异常字符串
我的问题是,如何从异常返回nil,而不是(在使用slurp的情况下)无法加载的文件名和异常文本?详情如下Clojure 如何分配nil而不是异常字符串,clojure,try-catch,Clojure,Try Catch,我的问题是,如何从异常返回nil,而不是(在使用slurp的情况下)无法加载的文件名和异常文本?详情如下 bene-cmp.core=> (load-file "src/bene_cmp/core.clj") #'bene-cmp.core/-main bene-cmp.core=> (def x (open-csv-file "test_file.csv")) #'bene-cmp.core/x bene-cmp.core=> x "test_file.csv (No su
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
我希望以下代码返回nil:
(defn open-csv-file
"Attempts to open a .csv file and complains if the file is not present."
[file-name]
(let [file-data
(try
(slurp file-name)
(catch Exception e (.getMessage e)))]
file-data))
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
下面是一个正在返回的示例
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
我试图避免修改此函数,使其抛出异常,然后让调用方使用try/catch块
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
谢谢。如果我理解您的问题,您只需更改以下内容:
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
(catch Exception e (.getMessage e)))]
为此:
bene-cmp.core=> (load-file "src/bene_cmp/core.clj")
#'bene-cmp.core/-main
bene-cmp.core=> (def x (open-csv-file "test_file.csv"))
#'bene-cmp.core/x
bene-cmp.core=> x
"test_file.csv (No such file or directory)"
bene-cmp.core=>
(catch Exception e))]
法布。我找不到太多关于Clojure的尝试/捕获的文章。谢谢。您知道,要捕获的前两个参数是异常类和绑定到异常的符号。后续参数只是要按指定顺序计算的元组。catch的返回值是最后一个元组的值。如果没有元组,则返回值为零。“tuple”是一个在这里没有意义的词——后面的参数只是任何类型的表达式。但是,就个人而言,我建议在这里写
nil
,以明确说明问题,特别是如果您不熟悉catch
的行为。当然,把它留白也没什么错;那也行,谢谢。我没有意识到在Clojure的上下文中,“tuple”的意思与“expression”不同。