Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 如何分配nil而不是异常字符串_Clojure_Try Catch - Fatal编程技术网

Clojure 如何分配nil而不是异常字符串

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

我的问题是,如何从异常返回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 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”不同。