(rontolisp) docs
← マクロ

handler-case

(handler-case expression (type ([var]) body...)... [(:no-error ([var]) body...)])

expression を評価し、その間にエラーが通知されたら、通知されたコンディションに type がマッチする最初の節に制御を移します。var(省略可)にはコンディションオブジェクトが束縛され、節本体の値がフォーム全体の値になります。どの節もマッチしなければエラーは外側へ伝播します(外側の handler-case が捕捉できます)。節の型には任意の typecase 指定子が使えます。define-condition で定義したコンディションクラスと組み込み階層(condition > serious-condition > errorwarning)を含みます。コンディションオブジェクトなしで通知されたエラー(素の (error "...") や組み込み内部の実行時エラー)は、スロット 1 にメッセージを持つ simple-error として捕捉されます。:no-error 節は正常終了時に(主)値を var に束縛して、ハンドラの外で実行されます。非局所脱出(return/return-from)は捕捉されずに通過し、expression 内の unwind-protect はハンドラより先に cleanup を実行します。

handler-caseインタプリタと JVM バックエンドでサポートされます。WASM コンパイラは拒否します(WASM のエラーは捕捉不能なトラップのため)。ハンドラはスレッド単位なので、rontolisp:http-handler の並行リクエスト同士は干渉しません。lite: handler-bind/restart-case のリスタートは未対応です(.todo/116 Phase 4)。

型付きコンディションはクラス階層でディスパッチされ、最初にマッチした節が勝ちます: