3.4 异常处理
异常处理的目的:
(1) 包装检查异常
(2) 使用finally块清理非内存资源如文件或网络句柄
(3) 响应问题:忽略异常,重新操作,转换异常为非异常结果
简化异常处理
在Clojure中,检查异常不是必须进行try..catch处理,如果不处理则直接忽略异常
资源清理
如果需要是否的资源有close方法,则可以使用with-open宏:
(with-open [name init-form] & body)
Clojure内部,with-open创建一个try块,将init-form的结果赋给name,然后运行body,最后在finally块中是否绑定到name的资源。如:
(defn spit [f content]
(with-open [#^PrintWriter w (writer f)]
(.print w content)))
(spit "hello.out" "hello, world")
将字符串"hello, world"写入文件hello.out
如果需要在finally块中做close以外事情,可以使用如下形式:
(try expr* catch-clause* finally-clause?)
; catch-clause -> (catch classname name expr*)
; finally-clause -> (finally expr*)
响应异常
最常见的情况是在catch块中响应异常。
示例:验证类是否可以
(defn class-available? [class-name]
(try
(Class/forName class-name) true
(catch ClassNotFoundException _ false)))
如果类找不到,则抛出ClassNotFoundException异常,返回false
异常处理的目的:
(1) 包装检查异常
(2) 使用finally块清理非内存资源如文件或网络句柄
(3) 响应问题:忽略异常,重新操作,转换异常为非异常结果
简化异常处理
在Clojure中,检查异常不是必须进行try..catch处理,如果不处理则直接忽略异常
资源清理
如果需要是否的资源有close方法,则可以使用with-open宏:
(with-open [name init-form] & body)
Clojure内部,with-open创建一个try块,将init-form的结果赋给name,然后运行body,最后在finally块中是否绑定到name的资源。如:
(defn spit [f content]
(with-open [#^PrintWriter w (writer f)]
(.print w content)))
(spit "hello.out" "hello, world")
将字符串"hello, world"写入文件hello.out
如果需要在finally块中做close以外事情,可以使用如下形式:
(try expr* catch-clause* finally-clause?)
; catch-clause -> (catch classname name expr*)
; finally-clause -> (finally expr*)
响应异常
最常见的情况是在catch块中响应异常。
示例:验证类是否可以
(defn class-available? [class-name]
(try
(Class/forName class-name) true
(catch ClassNotFoundException _ false)))
如果类找不到,则抛出ClassNotFoundException异常,返回false