Wenn Sie eine Single-Thread-Anwendung haben, können Sie ein einfaches try/catch in der Main-Funktion verwenden. Dies deckt jedoch keine Ausnahmen ab, die außerhalb der Main-Funktion, z. B. in anderen Threads, ausgelöst werden können (wie in anderen Kommentaren erwähnt). Dieser Code zeigt, wie eine Ausnahme dazu führen kann, dass die Anwendung beendet wird, obwohl Sie versucht haben, sie in der Main-Funktion zu behandeln (beachten Sie, wie das Programm ordnungsgemäß beendet wird, wenn Sie die Eingabetaste drücken und der Anwendung erlauben, ordnungsgemäß beendet zu werden, bevor die Ausnahme auftritt, aber wenn Sie es laufen lassen, wird es ziemlich unglücklich beendet):
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;
}
}
Sie können benachrichtigt werden, wenn ein anderer Thread eine Ausnahme auslöst, um einige Aufräumarbeiten durchzuführen, bevor die Anwendung beendet wird, aber soweit ich weiß, können Sie von einer Konsolenanwendung aus nicht erzwingen, dass die Anwendung weiterläuft, wenn Sie die Ausnahme auf dem Thread, von dem sie ausgelöst wird, nicht behandeln, ohne einige obskure Kompatibilitätsoptionen zu verwenden, damit sich die Anwendung so verhält, wie es bei .NET 1.x der Fall gewesen wäre:
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;
}
}
Meiner Meinung nach ist die sauberste Art, damit umzugehen in einer Konsolenanwendung ist es, sicherzustellen, dass jeder Thread einen Exception-Handler auf der Root-Ebene hat:
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");
}
}