(define-handler 《コンディションクラス》 《ハンドラ》) 【マクロ】
《コンディションクラス》に対して《ハンドラ》を大域ハンドラとして定義す る. 通常は,大域ハンドラとして定義される. 以下に説明するマクロ handler-bindや,マクロ handler-caseによって, 局所ハンドラが定義されているならば,最も新しく定義された局所ハンドラと 同じスコープを有するハンドラとして定義される. 《コンディションクラス》は,コンディションクラス名を与える. 《ハンドラ》は,コンディションを引数とする1引数の関数で与える.
例:次の例はコンディションクラス file-errorに対する大域ハンドラを定義 している. コンディションクラス file-errorのエラーが通知されると,エラーメッ セージを出力し他のパス名を用いて再実行するか尋ねてくる. 再実行する場合は,システムがパス名を再度聞いてくる. 再実行しない場合は,トップレベルに戻る.
ファイル "foo.in"は存在せず,ファイル "bar.in"は存在している ものとする.
> (define-handler file-error
(lambda (c)
(format #t "Error: File open error.~%")
(format #t " Cannot open file \"~a\"~%"
(file-error-pathname c))
(format #t "Retry other pathname?~%")
(format #t "Enter [Y/N] > ")
(case (read)
((y yes)
(format #t "Enter new pathname > ")
((error-function c) (read)))
(else (return-to-sctop)))))
#t
>(define in (open-input-file "foo.in"))
Error: File open error.
Cannot open file "foo.in"
Retry other pathname?
Enter [Y/N] > y
Enter new pathname > bar.in
in
> in
#<port from bar.in>
>
(remove-handler 《コンディションクラス》) 【マクロ】
《コンディションクラス》に対して定義されている大域ハンドラを取り外す. 《コンディションクラス》は,コンディションクラス名を与える. 指定したコンディションクラスに対する大域ハンドラが定義されていた場合, #tを返す. そうでなければ, #fを返す.
例:
> (remove-handler file-error)
#t
> (remove-handler error)
#f
>