หากคุณมีแอพพลิเคชั่นที่มีเธรดเดียวคุณสามารถใช้ลอง / จับได้ง่ายในฟังก์ชั่นหลักอย่างไรก็ตามสิ่งนี้จะไม่ครอบคลุมถึงข้อยกเว้นที่อาจถูกโยนออกไปนอกฟังก์ชั่นหลักในเธรดอื่น ๆ ความเห็น) รหัสนี้แสดงให้เห็นว่าข้อยกเว้นสามารถทำให้แอปพลิเคชั่นยุติได้แม้ว่าคุณจะพยายามจัดการกับมันใน 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()
การรบกวนของโปรแกรมอื่น ๆ ) แต่สิ่งที่ฉันได้รับคือข้อยกเว้นการเพิ่มซ้ำอีกครั้งและอีกครั้งและอีกครั้ง