Function ERROR

UP


Function ERROR

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
(factorial 20)
=>  2432902008176640000
(factorial -1)
>>  Error: -1 is not a valid argument to FACTORIAL.
>>  To continue, type :CONTINUE followed by an option number:
>>   1: Return to Lisp Toplevel.
>>  Debug> 
 (setq a 'fred)
=>  FRED
 (if (numberp a) (1+ a) (error "~S is not a number." A))
>>  Error: FRED is not a number.
>>  To continue, type :CONTINUE followed by an option number:
>>   1: Return to Lisp Toplevel.
>>  Debug> :Continue 1
>>  Return to Lisp Toplevel.

(define-condition not-a-number (error) 
                  ((argument :reader not-a-number-argument :initarg :argument))
  (:report (lambda (condition stream)
             (format stream "~S is not a number."
                     (not-a-number-argument condition)))))
=>  NOT-A-NUMBER

(if (numberp a) (1+ a) (error 'not-a-number :argument a))
>>  Error: FRED is not a number.
>>  To continue, type :CONTINUE followed by an option number:
>>   1: Return to Lisp Toplevel.
>>  Debug> :Continue 1
>>  Return to Lisp Toplevel.

副作用

指定されたコンディションのハンドラーは もし起動された場合は副作用を持つかもしれません。 プログラムの実行は停止してデバッガーに入るかもしれません。

影響

存在するハンドラーの束縛

*break-on-signals*

例外

もしdatumargumentsがコンディション指定子ではないときは 型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ような機会はありません。

このプログラムの意味は明確であり、 形式的な定理の証明によって「安全」であることが証明されるかもしれませんが、 そのような証明はプログラムが実行されても 安全であることを保証するものではありません。 コンパイラにはバグがあり、コンピュータには信号の不具合があり、 人間には常に予測不可能な方法で手動で介入することが知られています。 このような種類のエラーは、 コンディションシステムの正式なモデルの範囲を超えていますが、 この例で示唆されているような重大な影響を及ぼしうるコードを書くときに 真剣に検討すべきことの範囲を超えてはいません。


TOP, Github