English
Français

Blog of Denis VOITURON

for a better .NET world

Exceptions non gérées

Posted on 2010-01-27

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.

Consultez le site MSDN pour plus d’informations.

Langues

EnglishEnglish
FrenchFrançais

Suivez-moi

Articles récents