Si vous avez une application à un seul thread, vous pouvez utiliser un simple bloc try/catch dans la fonction Main, cependant, cela ne couvre pas les exceptions qui peuvent être lancé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 provoquer la terminaison de l'application même si vous avez essayé de la gérer dans Main (remarquez comment le programme se termine correctement si vous appuyez sur Entrée et permettez à l'application de se terminer correctement avant que l'exception ne se produise, mais si vous la laissez s'exécuter, elle se termine assez 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("Attrapé une 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 être notifié lorsque qu'un autre thread lance une exception pour effectuer un nettoyage avant la sortie de l'application, mais autant que je sache, vous ne pouvez pas, depuis une application console, forcer l'application à continuer de s'exécuter 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 rendre l'application comporter 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 quand même 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("Attrapé une exception");
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("Notifié d'une exception de thread... l'application se termine.");
}
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;
}
}
Alors, à mon avis, la manière 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("Attrapé une 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("Attrapé une exception sur l'autre thread");
}
}