私はこの初心者の質問があります:標準MLで、「エラー:バインドされていない変数またはコンストラクター:foo」のような例外をどのようにキャッチできますか?
私は次のプログラムでこれをやろうとしました:
(foo())
handle Error msg => ();
しかし、REPLは次のように文句を言います:「エラー:パターンの引数にコンストラクターが適用されていません:エラー」
前もって感謝します。
まず第一に、それはhandle Error => ...
(またはhandle error => ...
またはhandle TheSpecificExceptionIWantToCatch => ...
)であり、ではありませんhandle Error msg => ...
。handle Foo msg => ...
が1つの引数を持つコンストラクターである場合にのみ書き込むことができますがFoo
、エラーメッセージが示すように、そうでError
はありません。
第二に、「非バインド変数」はコンパイルエラーであり、例外ではないため、キャッチできません。
既存の答えに追加するだけです。Chaoが、コードを実行しようとして受け取ったメッセージに基づいてエラーを「キャッチ」しようとしていることに気づきました。REPLの真の例外メッセージは、行の直後に報告されval it = () : unit
、解釈フェーズの後に発生することを示します。さらに、New Jerseyv110.76インタープリターのStandardMLでは、実行時に次のようなメッセージが表示されます。
uncaught exception ExceptionName
raised at: filename.sml:linei.columni-linej.columnj
したがって、これらの行に沿って明示的なメッセージが表示されない場合は、例外が発生しておらず、しゃれが意図されていないという警告が表示されます。問題はエラーではなく例外をキャッチする方法だったので、例外のメカニズムを簡単に説明する必要があると思います。
exception MyException
またはexception MyException2 of String
raise MyException
またはraise (MyException2("Error in foo"))
e1
は例外を発生させ、ハンドラーは式e2を返します。e1 handle MyException => e2
複雑な関数のクリーンでエレガントな例外ハンドラーを記述し、必要に応じて実行を回復する方法の詳細については、RobertHarperによるオンラインノートProgramminginStandardMLのこのページをお読みください。