Wenn Sie eine Single-Threaded-Anwendung haben, können Sie einen einfachen Versuch / Fang in der Hauptfunktion verwenden. Dies gilt jedoch nicht für Ausnahmen, die außerhalb der Hauptfunktion ausgelöst werden können, z. B. in anderen Threads (wie in anderen angegeben) Bemerkungen). Dieser Code zeigt, wie eine Ausnahme dazu führen kann, dass die Anwendung beendet wird, obwohl Sie versucht haben, sie in Main zu behandeln (beachten Sie, wie das Programm ordnungsgemäß beendet wird, wenn Sie die Eingabetaste drücken und die Anwendung ordnungsgemäß beenden, bevor die Ausnahme auftritt, aber wenn Sie sie ausführen lassen , es endet ziemlich unglücklich):
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 eine Benachrichtigung erhalten, wenn ein anderer Thread eine Ausnahme auslöst, um eine Bereinigung durchzuführen, bevor die Anwendung beendet wird. Soweit ich jedoch feststellen kann, können Sie von einer Konsolenanwendung aus die Ausführung der Anwendung nicht erzwingen, wenn Sie die Ausnahme nicht behandeln auf dem Thread, von dem es geworfen wird, ohne einige obskure Kompatibilitätsoptionen zu verwenden, damit sich die Anwendung so verhält, wie es mit .NET 1.x der Fall wäre. Dieser Code zeigt, wie der Hauptthread über Ausnahmen von anderen Threads benachrichtigt werden kann, aber dennoch unglücklich beendet wird:
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 besteht die sauberste Möglichkeit, in einer Konsolenanwendung damit umzugehen, darin, sicherzustellen, dass jeder Thread einen Ausnahmehandler auf Stammebene 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");
}
}
Console.ReadLine()
oder irgendeine andere Störung des Programmflusses. Aber was ich bekomme, ist die Ausnahme, die immer wieder und immer wieder