Prolog Language
エラー処理と例外
サーチ…
インスタンス化エラー
引数が十分にインスタンス化されていない場合は、 インスタンス化エラーがスローされます 。
重要なことに、インスタンシエーション・エラーを サイレント・フェイルで置き換えることはできません。そのような場合には失敗は解決策がないことを意味しますが、インスタンス化エラーは引数のインスタンスが解決策に参加する可能性があることを意味します 。
これは、プログラムの宣言的な意味を変えずにサイレントエラーに置き換えることができるドメインエラーなどとは対照的です。
エラー処理に関する一般的な点
Prologには、Prolog ISO標準の一部である例外があります。
例外はthrow/1
でthrow/1
れ、 catch/3
でcatch/3
ます。
ISO規格では、エラーが投げられるか、投げられるかの多くのケースが定義されています。標準化された例外はすべて形式error(E,_)
です。ここでE
はエラーを示します。例として、 instantiation_error
、 domain_error
、およびtype_error
があります。
例外と関連して重要な述語はsetup_call_cleanup/3
です。
例外後のクリーンアップ
Prolog ISO標準に含まれていると考えられている実装の数が増えている現在の状態であるsetup_call_cleanup/3
という述語は、例外がスローされた後にリソースが正しく解放されるようにします。
一般的な呼び出しは次のとおりです。
setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))
この場合、 open/3
が呼び出された直後に例外や割り込みが発生することもあります。このため、 Setup
フェーズはアトミックに実行されSetup
。 call_cleanup/2
のみを提供するPrologシステムでは、表現するのがはるかに難しいです。
タイプとドメインのエラー
引数が期待される型でない場合、 型エラーが発生します。タイプの例は次のとおりです。
-
integer
-
atom
-
list
。
述部が予期されたタイプであるが予想されたドメインの外にある場合、 ドメイン・エラーが発生します。
たとえば、ドメインエラーは、0〜15の整数が必要であるが、引数が20の整数であれば許容されます。
宣言的には、タイプまたはドメインのエラーは、引数が間違ったタイプまたはドメインの成功した述語をインスタンス化することができないため 、 サイレント障害と同等です。