2009-04-16 5 views
2

Gibt es ein globales Ereignis in .NET Windows Forms und WPF-Anwendungen, äquivalent zu On_Error in ASP.NET - Global.aspx?Bei Fehler für Windows-Anwendung

+0

Dank Andre. So gibt es eine Möglichkeit, eine Ausnahme auf Anwendungsebene in C# zu verfolgen. –

Antwort

1
Application.ThreadException 

Dieses Ereignis wird immer dann ausgelöst, wenn eine nicht behandelte Ausnahme auftritt.

Ich abonniere meistens dieses Ereignis, und im Eventhandler protokolliere ich die aufgetretene Exception oder zeige eine MessageBox an, die anzeigt, dass etwas schief gelaufen ist.

2

Wie bereits von anderen erwähnt, können Sie Application.ThreadException

Für benutzerfreundliche Ausnahmebehandlung verwenden, lesen Sie in diesem 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

ich benutze wpf so wie main() –

+0

ja bekommen. Aber, in der Frage, die Sie als Windows-Formulare erwähnten. –

+0

Entschuldigung, obwohl es für beide gleich wäre ... ich bin neu bei WPF ... entdeckte, dass es kein main() gibt. jetzt nach dem googeln habe ich gelernt, wie man einen main() hinzufügt, aber fehler bekommen becoz ich habe auch eine ressourcendatei –

1

Es gibt grundsätzlich zwei Möglichkeiten zu stoppen nicht behandelte Ausnahmen global:

  • Application.ThreadException für Windows.Forms (wie schon von anderen darauf hingewiesen wird)
  • AppDomain.CurrentDomain.UnhandledException

Das folgende Beispielprogramm zeigt wie man das Ereignis UnhandledException in C# verwendet:

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

Zusätzlich zu Application.ThreadException sollten Sie AppDomain.CurrentDoman.UnhandledException behandeln. Der entsprechende Ausschnitt aus einem meiner Program.cs Dateien sieht wie folgt aus:

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

Edited hinzufügen: Hier ist eine good article, die weiter erklärt.

0

Für beide ASP.NET und WinForms-Anwendungen, da das Ereignis AppDomain UnhandledException ist:

AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException 

In diesem Handler können Sie jede benutzerdefinierte Protokollierung/Wiederherstellung erforderlich ausführen:

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

Bitte beachten dass Sie sind, nicht die Ausnahme in diesem Fall abfangen oder behandeln: Sie erhalten nur ein Benachrichtigungsereignis. Wenn Sie die Anwendung in Ihrem Event-Handler nicht beenden, wird die Exception an den übergeordneten Fehlerhandler weitergegeben, der sich normalerweise für WinForms-Apps im Betriebssystem befindet und zum bekannten Absturzdialog "Diese Anwendung hat ..." führt.

Verwandte Themen