トップレベルの例外ハンドラーがないため、.Net ランタイムが例外をキャッチし、最終的に実行する前にプログラムを中止します。これはポイントを示しています:
static void Main()
{
try
{
int i = 0;
try
{
int j = 1 / i; // Generate a divide by 0 exception.
}
finally
{
Console.Out.WriteLine("Finished");
Console.In.ReadLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
このコードでは、呼び出しチェーンの上位の try...catch で例外が処理されるようになり (たまたま同じメソッド内にあるだけです)、埋め込みの finally が実行されます。キャッチは、例外が発生している同じ関数内にある必要はありません。呼び出しチェーン内のどこにでも配置できます。
編集: 最初は、いつ、どこで例外がプログラムによってキャッチされるかが不確かに思えるかもしれません。しかし、外の世界がコードと対話するアプリケーションの境界について考えてみてください。通常、それらは制限され、明確に定義されています。したがって、コンソール アプリケーションの場合、境界は Main メソッドであり、ここに最上位の例外ハンドラーを配置できます。Web フォーム アプリケーションの場合、境界にはボタン クリック イベント (ユーザーが UI を操作している) などが含まれるため、そこにも例外ハンドラーを含めることができます。クラス ライブラリの場合、境界は通常、ライブラリ自体ではなく、ライブラリを呼び出すアプリケーションの境界です。したがって、ライブラリで例外をキャッチしないでください (賢明に回復できる場合を除きます)。代わりに、呼び出し元のアプリケーションにバブルアップさせます。