(rontolisp) docs
← 関数

rontolisp:catch

(rontolisp:catch future handler)

入力 future がエラーで確定したとき、handler を condition に適用して その戻り値で確定する新しい future を返します。正常に確定した場合は 値がそのまま通過します。ハンドラ自身がシグナルを上げた場合、返された future はその condition を運びます。

future が値として境界を越え、JavaScript の .catch 風の単一ハンドラ フォールバックが欲しいときに使います。型ディスパッチは字句的に (handler-case (rontolisp:await f) (my-err (c) ...)) として既に存在 するので、future が本体の中にあるならそちらを使ってください。catch ハンドラの中で型ディスパッチしたい場合は明示的に書きます:

(rontolisp:catch f (lambda (c)
                     (handler-case (signal c)
                       (my-err (e) ...)
                       (error (e) ...))))

第 1 引数が future 以外の場合は type-error になります。

cl:catch との名前衝突

Common Lisp の catch / throw はタグベースの非局所脱出の特殊形式 です。本操作は別パッケージの rontolisp:catch です: 修飾名は衝突しません (cl:catch は依然として CL 特殊形式)。cl-user (または両方を :use する パッケージ) のユーザーは、本操作を得るには明示的に rontolisp: / rl: 接頭辞が必要で、タグベースの特殊形式を得るには明示的な cl: 接頭辞 (または cl-user 内での裸の名前) が必要です。 (in-package :rontolisp) 内での裸の catch はそのどちらでもありません: この名前は cl に属し、当該パッケージは cl:use していないため、 修飾するまで "Undefined symbol: CATCH (use CL:CATCH)" エラーになります。

バックエンドのサポート

rontolisp:then と同じ: インタプリタ、JVM、 WASM --component。Preview 1 WASM は成功パス通過のみ (エラー経路には component バックエンドが提供する future 化されたエラー-at-await 契約 が必要です)。--no-gc はコンパイル時に拒否します。