如果您有单线程应用程序,则可以在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()
或程序流的任何其他干扰但我得到的是例外,一次又一次重新认识,并再次。