Exceptions non gérées
Lorsqu’un logiciel arrive en phase de mise en production, il ne devrait plus enclencher des exceptions non gérées. Malheureusement, le monde n’est pas parfait et il est donc toujours possible de voir une fenêtre comme celle-ci (ou pire, sans information de debuggage, si l’exception survient avant l’instanciation de la fenêtre principale).
Pour éviter cela et pour traiter tous les cas possibles d’exceptions non géréres, il est nécessaire d’intercepter les deux événements UnhandledException du domaine courant et ThreadException du thread courant. Le code suivant, activé uniquement en mode Release, réalise ces deux actions.
public static void Main(string[] args)
{
#if !DEBUG
AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
string message = "An unhandled error occured... \n\n" + ex.Message + ex.StackTrace;
MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
};
Application.ThreadException += delegate(object sender, System.Threading.ThreadExceptionEventArgs e)
{
DialogResult result = DialogResult.Abort;
try
{
Exception ex = e.Exception;
string message = "An unhandled error occured... \n\n" + ex.Message + ex.StackTrace;
result = MessageBox.Show(message, "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
finally
{
if (result == DialogResult.Abort)
{
Application.Exit();
}
}
};
#endif
// Start the main form
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
Je vous conseille bien évidemment de placer ce code en première partie de la méthode Main globale. Vous pouvez améliorer la gestion des exceptions en ajoutant un tracage dans le gestionnaire d’événements, dans un fichier log ou autres processus plus ergonomique pour l’utilisateur.