Function ERROR
error
datum &rest
arguments => |
datum, arguments - コンディション指定子であり、標準の型はsimple-error
。
error
は、コンディションを効果的にsignal
で実行します。
もしコンディションが捕捉されないときは、 (invoke-debugger condition)
が実行されます。 invoke-debugger
が呼び出された結果、 error
は直接戻ることはできず、 error
からの退出は ただハンドラーによる非局所的な遷移の制御か、 あるいは対話的なデバッガーのコマンドを使うことにのみ 実現できます。
defun factorial (x)
(cond ((or (not (typep x 'integer)) (minusp x))
(error "~S is not a valid argument to FACTORIAL." x))
(zerop x) 1)
((t (* x (factorial (- x 1))))))
(=> FACTORIAL
20)
(factorial => 2432902008176640000
1)
(factorial -1 is not a valid argument to FACTORIAL.
>> Error: -continue, type :CONTINUE followed by an option number:
>> To 1: Return to Lisp Toplevel.
>>
>> Debug> setq a 'fred)
(=> FRED
if (numberp a) (1+ a) (error "~S is not a number." A))
(not a number.
>> Error: FRED is continue, type :CONTINUE followed by an option number:
>> To 1: Return to Lisp Toplevel.
>> 1
>> Debug> :Continue
>> Return to Lisp Toplevel.
define-condition not-a-number (error)
(
((argument :reader not-a-number-argument :initarg :argument))lambda (condition stream)
(:report (format stream "~S is not a number."
(condition)))))
(not-a-number-argument => NOT-A-NUMBER
if (numberp a) (1+ a) (error 'not-a-number :argument a))
(not a number.
>> Error: FRED is continue, type :CONTINUE followed by an option number:
>> To 1: Return to Lisp Toplevel.
>> 1
>> Debug> :Continue >> Return to Lisp Toplevel.
指定されたコンディションのハンドラーは もし起動された場合は副作用を持つかもしれません。 プログラムの実行は停止してデバッガーに入るかもしれません。
存在するハンドラーの束縛
もしdatumとargumentsがコンディション指定子ではないときは 型type-error
のエラーが発生します。
cerror
, signal
, format
, ignore-errors
, *break-on-signals*
, handler-bind
, 9.1. コンディションシステムの説明
いくつかの実装では、デバッガーは独立したスタックフレームから 対話的に戻るためのコマンドを提供しています。 しかしプログラマーは次のようなコードを書くことに 自身を持たなければなりません。
defun wargames:no-win-scenario ()
(if (error "pushing the button would be stupid."))
( (push-the-button))
このシナリオでは、error
から戻って ボタンが押されるpush-the-button
ような機会はありません。
このプログラムの意味は明確であり、 形式的な定理の証明によって「安全」であることが証明されるかもしれませんが、 そのような証明はプログラムが実行されても 安全であることを保証するものではありません。 コンパイラにはバグがあり、コンピュータには信号の不具合があり、 人間には常に予測不可能な方法で手動で介入することが知られています。 このような種類のエラーは、 コンディションシステムの正式なモデルの範囲を超えていますが、 この例で示唆されているような重大な影響を及ぼしうるコードを書くときに 真剣に検討すべきことの範囲を超えてはいません。