restart-case,handler-bind用法。
樣例代碼:
(defun get-age (text)
(restart-case
(cond
((symbolp text) (error 'invalid-integer :msg "Invalid integer"))
((and (stringp text) (loop for x across text always (digit-char-p x)))
(parse-integer text :junk-allowed nil))
((eq (type-of text) (type-of 2)) text)
(t
(error 'invalid-integer :msg "Invalid integer2")))
(use-value (val) val)
(retry-parse (text) (get-age text))))
(define-condition invalid-integer (error)
((msg :initarg :msg
:reader msg)))
(defun retry-parse (text)
(let ((restart (find-restart 'retry-parse)))
(when restart
(invoke-restart 'retry-parse text))))
(defun test-1 (text default-value)
(handler-bind
((invalid-integer #'(lambda (e)
(format t "error msg:~a~%" (msg e))
(let ((it (find-restart 'use-value)))
(when
(invoke-restart it default-value)))))
(error (lambda (e)
(print e)
(retry-parse default-value))))
(get-age text)))
; (test-1 "as33" 34)
; (test-1 33 34)
; (test-1 'a 34)
; (test-1 "33" 34)