단일 스레드 응용 프로그램이있는 경우 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()
프로그램 흐름에 방해가 되지 않습니다). 그러나 내가 얻는 것은 예외가 계속해서 또 다시 발생하는 것입니다.