यदि आपके पास एक एकल-थ्रेडेड एप्लिकेशन है, तो आप मुख्य फ़ंक्शन में एक सरल कोशिश / कैच का उपयोग कर सकते हैं, हालांकि, यह अपवादों को कवर नहीं करता है जो मुख्य फ़ंक्शन के बाहर फेंक दिए जा सकते हैं, अन्य थ्रेड्स पर, उदाहरण के लिए (जैसा कि अन्य में उल्लेख किया गया है टिप्पणियाँ)। यह कोड दर्शाता है कि एक अपवाद के कारण एप्लिकेशन को समाप्त करने का कारण कैसे बन सकता है, भले ही आपने इसे मेन में संभालने की कोशिश की हो (ध्यान दें कि यदि आप एंटर दबाते हैं तो प्रोग्राम इनायत से बाहर निकल जाता है और एप्लिकेशन को अपवाद होने से पहले इनायत से बाहर निकलने की अनुमति देता है, लेकिन यदि आप इसे चलाने देते हैं , यह काफी दुर्भाग्यपूर्ण है):
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()
या किसी अन्य प्रोग्राम के प्रवाह में गड़बड़ी के। लेकिन मुझे जो कुछ भी मिलता है वह बार-बार अपवाद है, और फिर से।