R5RS Scheme では、何らかの操作に失敗した場合、 エラーを発生させる (signal an error) 必要がある。 「エラーを発生させる」という意味は、 Scheme 実装がエラーを検出して報告しなければならないという意味である。 さらに R5RS は、Scheme 実装が多くの状況で エラーを発生させることを推奨している (必須ではない)。
しかし、Scheme アプリケーションのプログラマが アプリケーションで発生したエラーを報告するための直接的な手段はない。 この点において、アプリケーションやライブラリで作成された Scheme 手続きは、 Scheme システムで提供される手続きとは対等ではないのである。
多くの Scheme システムでは、アプリケーション コードが エラー報告をするための機構をすでに備えている。 少なくとも、 Bigloo, Guile, MIT Scheme, PLT Scheme, RScheme, Scsh, SCM, および SLIB がサポートしているすべての Scheme 実装は、 このような機構を備えている。 これらの実装のうち、 Guile, MIT Scheme, PLT Scheme, RScheme, Scsh は、この SRFI と互換性があるエラー機構をもつ。 SLIB の実装は、この SRFI で提案する名前とは異なる名前を使用している。
要約すると、多くの実装ではこの SRFI で述べるエラー報告の機構がすでに存在し、 他の実装でも簡単にこの SRFI と互換性をもつようにできるということである。 そのため、ここで提案する機構は有用であると考えられるし、 ほとんどの主要な実装で簡単に実装できる。
次の手続きを定義する。
(error
<reason> [<arg1> [<arg2> ...]])
引数 <reason> は文字列でなければならない。
この手続き error
は R5RS に記述されているように
エラーを発生させ、
メッセージ <reason> と
オブジェクト <arg1>, <arg2>, .... を報告する。
「エラーを発生させる」ことや「報告する」ことの正確な意味は、
Scheme システムごとに大きく異なるため、
ここでは規定しない。
何らかの適切な処理を行うことが実装者に任されている。
いくつかの実装の例を以下に示す。
error
に渡された引数を
他のスレッドから取得できるようにしてもよい。
その実現方法については SRFI-18 の
thread-join!
機構を参照せよ。
error
は手続きかerror
を手続きではなく
マクロのような特殊フォームとして実装することを許すという選択肢もある。
これを許せば、エラーが発生したソースコード上の位置を取得する
というような処理がより簡単に実現できるだろう。
この選択肢は考慮したのだが、次の 2 つの理由により否決された。
error
は可変個の引数をとるので、
error
を呼び出すために apply
を使用すると便利なことがある。
しかし、error
を特殊フォームとして実装すると、
これができなくなる。
error
は手続きとして実装されているため、
特殊フォームとして実装する価値があるようには見えない。
(define (error reason . args) (display "Error: ") (display reason) (for-each (lambda (arg) (display " ") (write arg)) args) (newline) (scheme-report-environment -1)) ;; これがエラーを発生させることを期待しているこの実装には欠点があって、 多くの Scheme システムでは次の 2 つのメッセージを表示してしまう。
message
とそれに続く objs
scheme-report-environment
に不正な引数を指定したことによるメッセージ
SLIB
の手続きである slib:error
は、
この文書で述べた error
手続きと同じような動作をする。
そのため、SLIB がロードされているなら、
error
を次のように定義できる。
(define error slib:error)
もし SRFI 18 がサポートされているなら、
error
を SRFI 18 の例外機構を利用して実装してもよい。
(define (error reason . args) (raise (make-error-exception reason args)))ここで、
make-error-exception
は実装依存の手続きである。
Copyright (C) Stephan Houben (2001). All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.