Si vous avez une application à un seul thread, vous pouvez utiliser un simple try / catch dans la fonction Main, cependant, cela ne couvre pas les exceptions qui peuvent être levées en dehors de la fonction Main, sur d'autres threads, par exemple (comme indiqué dans d'autres commentaires). Ce code montre comment une exception peut entraîner la fermeture de l'application même si vous avez essayé de la gérer dans Main (notez comment le programme se termine correctement si vous appuyez sur Entrée et autorisez l'application à se fermer correctement avant que l'exception ne se produise, mais si vous la laissez s'exécuter) , il se termine malheureusement):
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;
}
}
Vous pouvez recevoir une notification lorsqu'un autre thread lève une exception pour effectuer un nettoyage avant la fermeture de l'application, mais pour autant que je sache, vous ne pouvez pas, à partir d'une application console, forcer l'application à continuer de fonctionner si vous ne gérez pas l'exception sur le thread à partir duquel elle est lancée sans utiliser certaines options de compatibilité obscures pour que l'application se comporte comme elle l'aurait fait avec .NET 1.x. Ce code montre comment le thread principal peut être notifié des exceptions provenant d'autres threads, mais se terminera toujours malheureusement:
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;
}
}
Donc, à mon avis, la façon la plus propre de le gérer dans une application console est de s'assurer que chaque thread a un gestionnaire d'exceptions au niveau racine:
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()
ou toute autre perturbation du déroulement du programme. Mais ce que j'obtiens est l'exception de sur-relancer encore et encore, et encore.