質問

私は C# でカスタム クラスを作成していますが、一部のメソッドで間違った入力を行うと、いくつかの例外がスローされます。例外がスローされた場合、スロー後のメソッド内のコードは引き続き実行されますか?スローの後に休憩を入れる必要がありますか、それともスローは常にメソッドを終了しますか?

役に立ちましたか?

解決

あなたが 投げる 例外の場合、次に実行されるコードは、メソッド内でそのスローをカバーする catch ブロック (存在する場合) です。 最後にブロックする (あれば)。try、try-catch、try-catch-finally、または try-finally を使用できます。その後、例外が処理されない場合、catch ブロックによって再スローされた場合、またはまったくキャッチされなかった場合、制御は呼び出し元に返されます。たとえば、このコードから「Yes1、Yes2、Yes3」を取得します...

try
{
    Console.WriteLine("Yes1");
    throw (new Exception());
    Console.WriteLine("No1");

}
catch
{
    Console.WriteLine("Yes2");
    throw;
    Console.WriteLine("No2");
}
finally
{
    Console.WriteLine("Yes3");
}

Console.WriteLine("No3");

他のヒント

スローは、このようにメソッドを出る、スタックに移動します。

私は何が起こっているか、あなたは自分のために表示されますデバッガを使用してプログラムをステップ実行することをお勧めします。学習のために非常に便利!

元の投稿に対する回答を探してここに来ましたが、投稿された非常に貴重な回答を見逃すところでした。 エリック・リッパート. 。コメントに投稿された彼の答えは次のとおりです。

これを 3 つの質問に分けてください。

(1) スロー後のメソッド内のコードは実行されますか?
はい。例外が try 内にあった場合は、一致する catch ブロックまたはfinally ブロック内のコードが実行されます。try ブロックがない場合は、NO です。最後に、最も近い囲みへの制御分岐、キャッチ、または (vb の) 例外フィルターがスタックをブロックします。

(2) 投げた後は休憩を入れなければなりませんか?
いいえ、決してそんなことはしないでください。throw ステートメントの終了点に到達できません。throw はコンパイラによって goto として扱われます。スローの直後のステートメントには到達できず、決して実行されません。

(3) スローすると必ずメソッドが終了しますか?
いいえ。スローが try 内にあり、その try に一致する catch ブロックがある場合、catch ブロックは例外を「食べる」ことができます。catch ブロックがない場合にのみ、例外はコール スタックへの非ローカルな goto を実行します。

これについてさらに質問がある場合は、C# 仕様を読むことをお勧めします。この動作はすべて明確に文書化されています。

最後に、「骨の折れる呼び出し元、そのデータは絶対に渡さないように言ったのに」のように、「骨の折れる」例外をスローしているように聞こえます。これは呼び出し側のバグを防ぐため、非常に優れています。ただし、その場合は、発信者があなたが何を期待しているかを知る何らかの方法を持っていることを確認する必要があります。呼び出し元が、ドキュメントに基づいてスローするかどうかを判断できない場合は、頭の悪い例外を作成したわけではなく、厄介な例外を作成したことになります。見る http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-Exceptions.aspx 詳細については。

あなたは最後にブロックし、その後、最後に下のコードは常に実行されます...キャッチ...試しにあなたのコードをラップしている場合。たとえばます:

Try
  ' do some stuff here
  ' Examine user input
  If user input isn't valid
      Throw new exception
Catch
   Throw ' Just re-throws the same exception
Finally
   ' This code will execute, no matter what - exception or not
End Try

あなたの実際の質問に余談:あなたは戻ってユーザーに検証情報を提供するために、例外を使用して再考することもできます。

の例外を上げると、高価なリソース単位と遅いです。あなたが適用する必要がバリデーションルールの数を持っている場合、これらの具体的なコードを書く - あなたはおそらく唯一のあなたが予想していないもののために例外処理に依存している必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top