Frage

  

Mögliche Duplizieren:
   .NET - Was ist der beste Weg, um ein „fangen alle Ausnahmen-Handler“ implementieren

Ich habe eine .NET-Konsole App-Anwendung, die eine Nachricht an den Benutzer abstürzt und Anzeigen. Alle mein Code ist in einem try{<code>} catch(Exception e){<stuff>} Block, sind aber immer noch gelegentlich Fehler angezeigt.

In einer Win32-App können Sie alle möglichen Ausnahmen / Abstürze erfassen, indem verschiedene Exception-Handler installieren:

/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

Was ist das Äquivalent in der .NET-Welt, damit ich umgehen kann / log / quiet alle möglichen Fehlerfälle?

War es hilfreich?

Lösung

Im Gegensatz zu dem, was einige andere geschrieben haben, es ist nichts falsch, alle Ausnahmen zu kontrollieren. Das Wichtigste ist, sie alle angemessen zu behandeln. Wenn Sie einen Stapelüberlauf oder aus dem Speicher erhalten haben, sollte die App für sie herunterzufahren. Denken Sie auch, dass OOM Bedingungen unter Berücksichtigung Ihrer Exception-Handler vom Laufen richtig verhindern können. Zum Beispiel, wenn Ihre Exception-Handler einen Dialog mit der Ausnahme Meldung angezeigt wird, wenn Sie aus der Erinnerung sind, dann kann es nicht genug für die Dialoganzeige links sein. Bestes es anmelden und sofort abgeschaltet.

Wie andere schon erwähnt, gibt es die UnhandledException und Thread Ereignisse, die Sie Sammlung Ausnahmen behandeln können, die sonst verpasst bekommen könnten. Dann einfach einen Exception-Handler um Ihre Hauptschleife werfen (eine WinForms-Anwendung vorausgesetzt).

Auch Sie sollten sich bewusst sein, dass OutOfMemoryExceptions nicht immer für nicht genügend Arbeitsspeicher Bedingungen geworfen. Ein OOM Zustand kann alle Arten von Ausnahmen auslösen, im Code oder im Rahmen, das muß nicht unbedingt etwas mit der Tatsache zu tun, dass die wirkliche Grunderkrankung aus der Erinnerung ist. Ich habe häufig InvalidOperationException oder Argument gesehen, wenn die zugrunde liegende Ursache tatsächlich aus dem Speicher ist.

Andere Tipps

Sie können einen Ereignishandler AppDomain.UnhandledException Ereignis hinzuzufügen, und es wird aufgerufen, wenn eine Ausnahme ausgelöst wird und nicht gefangen.

Dieser Artikel Codeproject von unserem Gastgeber Jeff Atwood ist das, was Sie brauchen. Enthält den Code zu fangen nicht behandelte Ausnahmen und besten pratices für Informationen über den Absturz an den Benutzer zeigt.

Die Global.asax Klasse ist die letzte Verteidigungslinie. Schauen Sie sich:

protected void Application_Error(Object sender, EventArgs e)

Methode

Beachten Sie, dass einige Ausnahme gefährlich sind zu fangen - oder meist uncatchable,

  • OutOfMemoryException: alles, was Sie in den catch-Handler tun könnte Speicher zuweisen (in der verwalteten oder nicht verwalteten Seite der CLR) und damit ein weiteren OOM auslösen
  • Stackoverflow: je nachdem, ob die CLR es früh genug erkannt wird, könnte erhalten Sie benachrichtigt. Worst-Case-Szenario, es ist einfach tötet den Prozess.

Sie können die AppDomain.CurrentDomain.UnhandledException verwenden, um ein Ereignis zu bekommen.

Obwohl fängt alle Ausnahmen ohne den Plan, um sie richtig zu handhaben ist sicherlich eine schlechte Praxis, denke ich, dass eine Anwendung in einer anmutigen Weise ausfallen soll. Ein Absturz sollte der Benutzer nicht zu Tode erschrecken, und zumindest sollte es eine Beschreibung des Fehlers anzuzeigen, um einige Informationen zu den technischen Support Sachen zu berichten, und idealerweise eine Taste, um die Anwendung zu schließen und neu starten. In einer idealen Welt sollte die Anwendung in der Lage sein, die Benutzerdaten-Dump auf der Festplatte, und dann versuchen, es zu gewinnen (aber ich sehe, dass dies zu viel verlangt).

Wie auch immer, ich in der Regel verwenden:

AppDomain.CurrentDomain.UnhandledException

Sie auch mit Application.ThreadException Ereignisse gehen können.

Wenn ich ein .NET-app Entwicklung in einer COM-basierten Anwendung ausgeführt wird; Dieses Ereignis war das sehr nützlich, da AppDomain.CurrentDomain.UnhandledException nicht in diesem Fall nicht funktioniert.

Ich glaube, Sie sollten lieber nicht einmal alle Exception fangen, aber besser lassen sie dem Benutzer angezeigt werden. Der Grund dafür ist, dass Sie nur Ausnahmen fangen sollten, die Sie tatsächlich verarbeiten können. Wenn Sie in eine Ausnahme ausgeführt, die das Programm führt zu stoppen, aber es immer noch zu fangen, könnte dies viel schwerer zu Problemen führen. Lesen Sie auch FAQ: Warum FxCop warnen vor catch (Exception)? .

Beachten Sie, dass diese nicht behandelte Ausnahmen fangen können die Sicherheitsanforderungen Ihrer Anwendung ändern. Ihre Anwendung beendet möglicherweise korrekt unter bestimmten Kontexten ausgeführt wird (wenn sie von einer Netzwerkfreigabe ausgeführt werden, etc.). Achten Sie darauf, gründlich zu testen.

es tut nicht weh beide verwenden     AppDomain.CurrentDomain.UnhandledException     Application.ThreadException

, aber bedenken Sie, dass Ausnahmen auf Sekundär Fäden werden von diesen Handler gefangen; verwenden SafeThread für sekundäre Threads bei Bedarf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top