kprolog K-Prolog Compiler Version 6.0

キャッチとスロー

catch(Goal,Catcher,Recovery) と throw(Catcher) により、大域的な脱出を実現できます。
catch(Goal,Catcher,Recovery) は直ちに Goal を実行しますが、 Goalの中で throw(Catcher) が実行されると、throw は Goal の実行を中断して Recoveryを呼び出します。

catch/3に指定するCatcher は任意の項です。 throw による Catcher の検索は、 最後に実行された catch から順に行います。
たとえば、throw(tag1(someinfo)) は、catch(Goal,tag1(X),recovery(X)) でつかまえる ことができます。
このとき、Goal は失敗して単一化の効果は失われますが、Catcher同士は 副作用として一致させられるので、上例で X は someinfo になります。
Goal の中で、Catcher とマッチする throw が行われなければ、catch の実行は Goalの実行と等価です。

もし、throw されたCatcherを受け取るcatch/3の呼び出しがなければ、 トップレベルでは既定のメッセージが表示されます。トップレベルを 持たずに実行している場合は、致命的なエラーとして扱われます。 throw は割り込み処理例外処理を行う述語の中に書くことができます。

[例]

   :- on_interrupt(onintr).
   onintr :- throw(cond(intr)).
   と
   catch(Goal,cond(Code),true)
によって、割り込みによってGoalを強制的に終了させられます。


一つ上に戻る 目次に戻る