隠蔽されたコンディションの発生を活性化する - lisp-cookbook-ja/common-lisp GitHub Wiki

コンディション

発生するコンディションは、handler-case等によって捕捉することが可能です。

ignore-errors等でエラー等のコンディションを無視することにした場合、無視する範囲が広範囲になるとデバッグ時にエラーの発生場所の特定が困難になります。

このような場合、break-on-signalsに発生時に中断したいコンディションを指定することで発生場所を特定することが可能です。

(define-condition x-error (error) ())


(defun foo ()
  (when (oddp (random 2))
    (error 'x-error)))


(defun bar ()
  (when (oddp (random 3))
    (error "bar!")))


(defun baz ()
  (handler-case (progn
                  (foo)
                  (bar)
                  (ignore-errors (error "ignore me")))
    (error () nil)))

通常の実行(break-on-signalsはnil)

(baz)
;=>  NIL

error(とそのサブクラス)を捕捉したい場合

(setq *break-on-signals* 'error)

(baz)
;!!> Condition X-ERROR was signalled.(fooで中断)
; or
;!!> ignore me(ignore-errorsで中断)
; or
;!!> bar!(barで中断)

x-error(とそのサブクラス)を捕捉したい場合

(setq *break-on-signals* 'x-error)

(baz)
;!!> Condition X-ERROR was signalled.(fooで中断)

errorとそのサブクラスでx-error以外を捕捉したい場合

(setq *break-on-signals* '(and error (not x-error)))

(baz)
;!!> ignore me(ignore-errorsで中断)
; or
;!!> bar!(barで中断)