シングルスレッドアプリケーションの場合は、Main関数で単純なtry / catchを使用できますが、これは、他のスレッドなど、Main関数の外部でスローされる可能性のある例外をカバーしていません(他のコメント)。このコードは、Mainで例外を処理しようとした場合でも、例外が原因でアプリケーションが終了する方法を示しています(Enterキーを押して例外が発生する前にアプリケーションを正常に終了させると、プログラムが正常に終了することに注意してください。 、それは非常に不幸に終了します):
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void DemoThread()
{
for(int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
アプリケーションが終了する前に別のスレッドが例外をスローしてクリーンアップを実行したときに通知を受け取ることができますが、私の知る限り、コンソールアプリケーションからは、例外を処理しないとアプリケーションを強制的に実行し続けることができません。いくつかのあいまいな互換性オプションを使用せずにアプリケーションが.NET 1.xの場合と同じように動作するようにすることなく、それがスローされるスレッド上で。このコードは、メインスレッドに他のスレッドからの例外を通知する方法を示していますが、それでも不幸に終了します。
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("Notified of a thread exception... application is terminating.");
}
static void DemoThread()
{
for(int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
したがって、私の意見では、コンソールアプリケーションでそれを処理する最もクリーンな方法は、すべてのスレッドがルートレベルで例外ハンドラーを持つようにすることです。
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void DemoThread()
{
try
{
for (int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception on the other thread");
}
}
Console.ReadLine()
か、プログラムの流れの他の乱れをしかし、私は取得すると、例外の再引き上げ何度も何度もあり、そして再び。。