2014-03-15-01-Common Lisp のコンディション機構-2
>> Site top >> weblog >> 月別アーカイブ >> 2014年03月のlog >> 2014-03-15-01-Common Lisp のコンディション機構-2
最終更新日付:2014/03/15 01:00:00
Common Lisp のコンディション機構-2
2014 年 03 月 15 日
前回は、コンディションの通知と捕捉だけ書いた。再起動についても書きたいが、今回は前回の補足を先に。
前回はからっぽの divide-by-zero を書いたが、今回は(defclass でいうところの)スロットを追加するところから。前回の define-condition をこう変える。
(define-condition divide-by-zero (error) ((arg1 :initarg :arg1 :reader divide-by-zero-arg1) (arg2 :initarg :arg2 :reader divide-by-zero-arg2)))
arg2 は確実にゼロなのだけど、まぁそこはいいや。これによって、test-divide は以下のように書けるようになり、コンディションとともに渡されたパラメータを通知できる。
(defun test-divide (a b) (when (zerop b) (error 'divide-by-zero :arg1 a :arg2 b)) (/ a b))
test-driver を修正して、この情報を利用する。とりあえず、以下のように。
(defun test-driver (a b) (handler-case (test-divide a b) (divide-by-zero (err) (format t "WARNING : divide by zero. arg1 = ~A, arg2 = ~A.~%" (divide-by-zero-arg1 err) (divide-by-zero-arg2 err)) :infinite))) * (test-driver 10 0) WARNING : divide by zero. arg1 = 10, arg2 = 0. ; => :infinite
再起動は次回でいいや。
コメント
このページのタグ
Page tag : Common Lisp
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.