4

私はこの初心者の質問があります:標準MLで、「エラー:バインドされていない変数またはコンストラクター:foo」のような例外をどのようにキャッチできますか?

私は次のプログラムでこれをやろうとしました:

(foo())
handle Error msg => ();

しかし、REPLは次のように文句を言います:「エラー:パターンの引数にコンストラクターが適用されていません:エラー」

前もって感謝します。

4

2 に答える 2

3

まず第一に、それはhandle Error => ...(またはhandle error => ...またはhandle TheSpecificExceptionIWantToCatch => ...)であり、ではありませんhandle Error msg => ...handle Foo msg => ...が1つの引数を持つコンストラクターである場合にのみ書き込むことができますがFoo、エラーメッセージが示すように、そうでErrorはありません。

第二に、「非バインド変数」はコンパイルエラーであり、例外ではないため、キャッチできません。

于 2012-10-18T15:03:11.850 に答える
1

既存の答えに追加するだけです。Chaoが、コードを実行しようとして受け取ったメッセージに基づいてエラーを「キャッチ」しようとしていることに気づきました。REPLの真の例外メッセージは、行の直後に報告されval it = () : unit、解釈フェーズの後に発生することを示します。さらに、New Jerseyv110.76インタープリターのStandardMLでは、実行時に次のようなメッセージが表示されます。

uncaught exception ExceptionName raised at: filename.sml:linei.columni-linej.columnj

したがって、これらの行に沿って明示的なメッセージが表示されない場合は、例外が発生しておらず、しゃれが意図されていないという警告が表示されます。問題はエラーではなく例外をキャッチする方法だったので、例外のメカニズムを簡単に説明する必要があると思います。

  1. コードのどこかで、それが使用される場所の字句スコープ内で、例外バインディングを定義する必要があります: exception MyExceptionまたはexception MyException2 of String
  2. 式のどこかで、通常の制御フローの中断に値するケースが見つかり、次のプリミティブを使用してそれを実行します。 raise MyExceptionまたはraise (MyException2("Error in foo"))
  3. フローの例外的な中断は、例外コンストラクターでパターンマッチングを使用し、評価用の代替式を送信するハンドル式でキャッチできます。この場合、式e1は例外を発生させ、ハンドラーは式e2を返します。e1 handle MyException => e2

複雑な関数のクリーンでエレガントな例外ハンドラーを記述し、必要に応じて実行を回復する方法の詳細については、RobertHarperによるオンラインノートProgramminginStandardMLのこのページをお読みください。

于 2017-05-02T04:55:55.643 に答える