2009-04-16 4 views
2

Existe-t-il un événement global dans les formulaires .NET Windows Forms et les applications WPF, équivalent à On_Error dans ASP.NET - Global.aspx?En cas d'erreur pour l'application Windows

+0

Merci André. Il existe donc un moyen de tracer une exception au niveau de l'application dans C#. –

Répondre

1
Application.ThreadException 

Cet événement est déclenché lorsqu'une exception non gérée se produit.

Je m'abonne pour la plupart à cet événement, et, dans eventhandler, j'enregistre l'exception qui s'est produite, ou affiche un MessageBox qui affiche que quelque chose s'est mal passé.

2

Comme mentionné par d'autres, vous pouvez utiliser Application.ThreadException

Pour les utilisateurs d'exception Manipulation conviviale, vérifier link.

[STAThread] static void Main() { 
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
    Application.Run(new Form1()); 
} 

private void button1_Click(object sender, System.EventArgs e) { 
    throw new Exception("Whoops"); 
} 

private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { 
    MessageBox.Show(e.Exception.Message); 
} 
+0

J'utilise wpf alors comment obtenir principal() –

+0

oui. Mais, dans la question que vous avez mentionnée sous forme de fenêtres. –

+0

désolé je pense que ce serait pareil pour les deux ... je suis nouveau à WPF ... a découvert qu'il n'y a pas de main(). maintenant après googling je dois savoir comment ajouter un principal() mais obtenir une erreur becoz j'ai aussi un fichier de ressources –

1

Il existe essentiellement deux options pour piéger les exceptions non gérées au niveau mondial:

  • Application.ThreadException pour Windows.Forms (comme déjà souligné par d'autres)
  • AppDomain.CurrentDomain.UnhandledException

L'exemple suivant montre de programme comment utiliser l'événement UnhandledException en C#:

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Exception ex = (Exception)e.ExceptionObject; 
     Console.WriteLine("Unhandled exception!!"); 
     Console.WriteLine(ex.InnerException.Message); 
    } 
} 
1

En plus de Application.ThreadException, vous devez gérer AppDomain.CurrentDoman.UnhandledException. L'extrait pertinent d'un de mes fichiers Program.cs ressemble à ceci:

Application.ThreadException += new ThreadExceptionEventHandler(AppExceptionHandler.Application_ThreadException); 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppExceptionHandler.CurrentDomain_UnhandledException); 

Edité pour ajouter: Voici un good article qui explique plus loin.

0

Pour les deux ASP.NET et des applications WinForms, il y a l'événement AppDomain UnhandledException:

AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException 

Dans ce gestionnaire, vous pouvez effectuer une journalisation nécessaire personnalisée/récupération:

Private Sub UnhandledException(ByVal sender As Object, ByVal e As System.UnhandledExceptionEventArgs) 
    Console.WriteLine(vbCrLf & "Unhandled exception:" & vbCrLf & e.ExceptionObject.ToString) 
End Sub 

S'il vous plaît noter que vous êtes pas en attrapant ou en gérant l'exception dans ce cas: vous recevez uniquement un événement de notification. À moins que vous ne terminiez l'application dans votre gestionnaire d'événements, l'exception sera propagée au gestionnaire d'erreurs de niveau supérieur, qui pour les applications WinForms sera généralement dans le système d'exploitation, conduisant à la fenêtre contextuelle «Cette application a ...».