Tuy nhiên, nếu bạn có một ứng dụng một luồng, bạn có thể sử dụng một lần thử / bắt đơn giản trong chức năng Chính, tuy nhiên, điều này không bao gồm các ngoại lệ có thể được ném ra ngoài chức năng Chính, ví dụ như trên các luồng khác (như đã lưu ý khác bình luận). Mã này cho thấy cách một ngoại lệ có thể khiến ứng dụng chấm dứt ngay cả khi bạn đã cố xử lý nó trong Main (chú ý cách chương trình thoát ra một cách duyên dáng nếu bạn nhấn enter và cho phép ứng dụng thoát một cách duyên dáng trước khi ngoại lệ xảy ra, nhưng nếu bạn để nó chạy , nó chấm dứt khá không vui):
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;
}
}
Bạn có thể nhận được thông báo khi một luồng khác ném ngoại lệ để thực hiện dọn dẹp trước khi thoát ứng dụng, nhưng theo tôi có thể nói, bạn không thể, từ một ứng dụng bảng điều khiển, buộc ứng dụng tiếp tục chạy nếu bạn không xử lý ngoại lệ trên luồng mà nó được ném mà không sử dụng một số tùy chọn tương thích tối nghĩa để làm cho ứng dụng hoạt động giống như với .NET 1.x. Mã này cho thấy cách luồng chính có thể được thông báo về các ngoại lệ đến từ các luồng khác, nhưng vẫn sẽ chấm dứt một cách không vui:
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;
}
}
Vì vậy, theo tôi, cách sạch nhất để xử lý nó trong ứng dụng giao diện điều khiển là đảm bảo rằng mọi luồng đều có một trình xử lý ngoại lệ ở cấp gốc:
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()
hoặc có bất kỳ sự xáo trộn nào khác về luồng chương trình. Nhưng điều tôi nhận được là ngoại lệ tái lập lại nhiều lần, và một lần nữa.