Java では、catch 句によって例外がキャッチされ、その catch ブロックが例外をスローした場合、スレッドが終了する前に、関連する finally ブロック (存在する場合) を制御がスローすることを知っています。ただし、これは C# には当てはまらないようです。
C# でこの動作をほぼ反映することは、例外をスローする catch ブロックを含む try-catch ステートメントの try ブロック内に try-finally ステートメントを配置することによって可能ですが、たとえば、finally がブロックには、例外をログに記録することになっている Stream Writer を破棄するコードが含まれていると想定されています。
C# で java のような try-catch-finally 例外処理動作を実現するクリーンな方法はありますか?
リクエストされたサンプル コードの更新は次のとおりです。
StreamWriter writer = new StreamWriter("C:\\log.txt");
try
{
throw new Exception();
}
catch (Exception e)
{
writer.WriteLine(e.Message);
throw e;
}
finally
{
if (writer != null)
{
writer.Dispose();
}
}
そのコードをコンソール アプリケーションに追加して実行し、再スローされた例外を未処理のままにし、C:\log.txt の削除を試みます。制御が finally ブロックを通過したことがないため、それはできません。また、finally ブロック内のある行にブレークポイントを追加すると、ヒットしないことがわかります。(私はVS2005を使用しています)。
私の知る限り、コントロールが finally ブロックを通過するようにする唯一の方法は、再スローされた例外が外側の try ブロックの catch ブロックによって処理される場合です (上記のコードを try ブロック内に配置した場合)。別の try-catch ステートメントの)。
私が提供したサンプル コードのように、例外がキャッチされず、アプリケーションを終了できる場合、制御は finally ブロックを通過しません。
Javaではそうです。C# では、少なくとも私が見たものに基づくと、そうではありません。