表題

エラー報告機構

著者

Stephan Houben

状態

この SRFI は現在「確定」の状態である。 SRFI の各状態の説明については ここ を参照せよ。 この SRFI に関する議論については メーリングリストのアーカイブ を参照せよ。

概要

この SRFI では、Scheme コードがエラーを報告して実行を中止するための機構を提案する。 ここで提案する機構は、すでにさまざまな Scheme システムで実装されており、 (完全ではないにせよ) すべての R5RS 準拠の Scheme で実装することができる。

論拠

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 システムごとに大きく異なるため、 ここでは規定しない。 何らかの適切な処理を行うことが実装者に任されている。 いくつかの実装の例を以下に示す。

  1. <reason> と <arg1>... を画面に表示し、Scheme プログラムを停止する。 (この動作は、バッチ コンパイラとして実装された Scheme システムに適しているだろう)
  2. <reason> と <arg1>... を画面に表示し、 read-evaluate-print ループに戻る。 (この動作は、対話的な実装に適しているだろう)
  3. マルチスレッド システムの場合: 現在のスレッドを停止する。他のスレッドは停止しない。 error に渡された引数を 他のスレッドから取得できるようにしてもよい。 その実現方法については SRFI-18 の thread-join! 機構を参照せよ。
  4. <reason> と <arg1>... をエラー オブジェクトとしてカプセル化し、 それを例外ハンドラに渡す。 デフォルトの例外ハンドラは、項目 1 ~ 3 で述べた処理を行うかもしれない。
  5. 完全に無人の状態で実行される Scheme システムで 人間にエラーを通知する手段がまったくない場合は、 何も処理を行わないというのが唯一妥当な動作となるだろう。 しかし、この実装は最後の手段と考えるべきである。 もしも、すべての実装者がこの動作を選択するとすれば、 明らかにこの SRFI はそれほど有用ではないものとなってしまう。
<reason> と <arg1>... 以外に 追加の情報を報告するように実装してもよい。 たとえば、エラーが発生した手続きの名前を報告したり、 スタック トレースを表示してもよい。 しかし、それを実装するには、Scheme 実装に固有のサポートが必要である。

なぜ error は手続きか

error を手続きではなく マクロのような特殊フォームとして実装することを許すという選択肢もある。 これを許せば、エラーが発生したソースコード上の位置を取得する というような処理がより簡単に実現できるだろう。 この選択肢は考慮したのだが、次の 2 つの理由により否決された。
  1. error は可変個の引数をとるので、 error を呼び出すために apply を使用すると便利なことがある。 しかし、error を特殊フォームとして実装すると、 これができなくなる。
  2. 前述したすべての Scheme 実装では、 現在、error は手続きとして実装されているため、 特殊フォームとして実装する価値があるようには見えない。

実装

ほとんどの R5RS Scheme で動作する実装を次に示す。
  (define (error reason . args)
      (display "Error: ")
      (display reason)
      (for-each (lambda (arg)
                  (display " ")
      (write arg))
    args)
      (newline)
      (scheme-report-environment -1))  ;; これがエラーを発生させることを期待している
この実装には欠点があって、 多くの Scheme システムでは次の 2 つのメッセージを表示してしまう。
  1. メッセージ message とそれに続く objs
  2. 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.


編集者: Mike Sperber
最終更新日時: Sun Jan 28 13:40:28 MET 2007