.net では、例外が発生すると、システムはtry
スタック上のネストされたブロックを検索してcatch
、例外をキャッチできるブロックがあるかどうかを判断します。これは、finally
ブロックが実行される前に発生します。例外をキャッチできるブロックがない場合、システムはブロックを実行せずに「未処理の例外」ハンドラーを呼び出しfinally
ます。
システムが例外をキャッチできるブロックがあると判断した場合、システムはスタックの巻き戻しを開始し、見つかったブロックまでスタックを巻き戻すか、例外が発生するまでfinally
、内部ブロックに関連付けられたブロックを実行します。ブロックの実行時にスローされます。後者の場合、前の例外は破棄され、それ以上処理されません。例外処理は、新しくスローされた例外で新たに開始されます。try
catch
finally
例外をキャッチしたい場合と、単に例外を処理したい場合 (ただし、キャッチされていないとみなす) の間には意味上の違いがありますが、C# でその区別を明確に表現する方法はありません。例外をキャッチするコードは、それを解決することが期待されています。C# でできる最善の方法は、catch
(システムの例外処理ロジックに、例外をキャッチすると考えるように指示する) を使用してから、 throw
, を使用して、最終的に解決したくないことを示すことです (これは発生します)。内側の「finally」ブロックが実行された後)。vb.net などの他の一部の言語では、finally
ブロックが実行される前に、例外をキャッチせずに例外に対処することができます。catch
と_throw
ingせずに例外をキャプチャすることとは異なりますcatch
が、区別が重要になるケースはほとんどありません。C# を使用していて、ファイナライザー ブロックが実行される前に内部コードから例外をキャプチャする可能性のある周囲のコードに敵対することを避けたい場合、最善の方法は、おそらく vb で記述された例外処理ラッパー メソッドを記述することです (または他の誰かに依頼することです)。それを行う)、それを DLL にコンパイルし、適切な try/filter/catch/finally ブロック内で呼び出すために、ラムダを使用してそのような関数メソッドをフィードします。