コンディションを合成する


Tags: R6RS, コンディション

実際に起こった例外的状況をコンディションで説明する場合、単一のコンディションによってではなく、例外の様々な側面を複数のコンディションの合成として記述する。

例えば、コンディションを定義するときの例として扱った &http-condition を実際に HTTP 接続を扱うプログラムのなかで使う場合、エラーが発生したこと、例外の発生した場所、操作を行なったときに渡されたオブジェクトなどの情報もあると有益であろう。これらの情報はそれぞれ &error コンディション、 &who コンディションと &irritants コンディションで表される。

コンディションを合成するには condition 手続きを使う。この手続きは引数として受け取ったコンディションを合成したコンディションを返す。

HTTP 接続における例外的状況を通知する http-error 手続きは次のように書けるであろう。

(import (rnrs))

;; &http-condition の定義
...

(define (http-error who status-code header body . irritants)
  (raise (apply condition
                (make-error)
                (make-http-condition status-code header body)
                (make-irritants-condition irritants)
                (if who (make-who-condition who) '()))))