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.

Consultez le site MSDN pour plus d’informations.

Advertisements
Tagged with: ,
Posted in Tips and others

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow me
   RSS Feed    Twitter    Linked In

Write you email address to subscribe at this blog and to receive new posts by mail.

Join 611 other followers

Who I am?






%d bloggers like this: