Eine Ausnahme ist ein Blockierungsfehler .
Zunächst sollte die beste Vorgehensweise darin bestehen, keine Ausnahmen für Fehler jeglicher Art auszulösen, es sei denn, es handelt sich um einen Blockierungsfehler .
Wenn der Fehler blockiert , lösen Sie die Ausnahme aus. Sobald die Ausnahme bereits ausgelöst wurde, müssen Sie sie nicht mehr ausblenden, da sie außergewöhnlich ist. Informieren Sie den Benutzer darüber (Sie sollten die gesamte Ausnahme in etwas umformatieren, das für den Benutzer in der Benutzeroberfläche nützlich ist).
Ihre Aufgabe als Softwareentwickler ist es, einen Ausnahmefall zu vermeiden , in dem bestimmte Parameter oder Laufzeitsituationen in einer Ausnahme enden können. Das heißt, Ausnahmen dürfen nicht stummgeschaltet werden, aber diese müssen vermieden werden .
Wenn Sie beispielsweise wissen, dass eine Ganzzahl- Eingabe ein ungültiges Format haben kann, verwenden Sie int.TryParse
stattdessen anstelle von int.Parse
. Es gibt viele Fälle, in denen Sie dies tun können, anstatt nur zu sagen: "Wenn dies fehlschlägt, lösen Sie einfach eine Ausnahme aus."
Ausnahmen zu werfen ist teuer.
Wenn schließlich eine Ausnahme ausgelöst wird, anstatt die Ausnahme nach dem Auslösen in das Protokoll zu schreiben, besteht eine der besten Methoden darin, sie in einem Ausnahmebehandler der ersten Chance abzufangen . Beispielsweise:
- ASP.NET: Global.asax Application_Error
- Andere: AppDomain.FirstChanceException-Ereignis .
Mein Standpunkt ist, dass lokale Versuche / Fänge besser für die Behandlung von Sonderfällen geeignet sind, in denen Sie eine Ausnahme in eine andere übersetzen können oder wenn Sie sie für einen sehr, sehr, sehr, sehr, sehr speziellen Fall (einen Bibliotheksfehler) "stumm schalten" möchten eine nicht verwandte Ausnahme auslösen, die Sie stummschalten müssen, um den gesamten Fehler zu umgehen).
Für den Rest der Fälle:
- Vermeiden Sie Ausnahmen.
- Wenn dies nicht möglich ist: Ausnahmebehandlungsroutinen der ersten Chance.
- Oder verwenden Sie einen PostSharp-Aspekt (AOP).
Antwort auf @thewhiteambit auf einen Kommentar ...
@thewhiteambit sagte:
Ausnahmen sind keine schwerwiegenden Fehler, sondern Ausnahmen! Manchmal sind sie nicht einmal Fehler, aber sie als schwerwiegende Fehler zu betrachten, ist ein völlig falsches Verständnis dessen, was Ausnahmen sind.
Wie kann eine Ausnahme nicht einmal ein Fehler sein?
- Keine Datenbankverbindung => Ausnahme.
- Ungültiges Zeichenfolgenformat zum Parsen auf eine Ausnahme vom Typ =>
- Der Versuch, JSON zu analysieren, und während der Eingabe ist eigentlich keine JSON => Ausnahme
- Argument,
null
während Objekt erwartet wurde => Ausnahme
- Einige Bibliotheken haben einen Fehler => löst eine unerwartete Ausnahme aus
- Es gibt eine Socket-Verbindung und die Verbindung wird getrennt. Dann versuchen Sie eine Nachricht zu senden => Ausnahme
- ...
Wir könnten 1k Fälle auflisten, in denen eine Ausnahme ausgelöst wird, und schließlich wird jeder der möglichen Fälle ein Fehler sein .
Eine Ausnahme ist ein Fehler, da es sich letztendlich um ein Objekt handelt, das Diagnoseinformationen sammelt - es hat eine Meldung und es passiert, wenn etwas schief geht.
Niemand würde eine Ausnahme auslösen, wenn es keinen Ausnahmefall gibt. Ausnahmen sollten blockierende Fehler sein, da Ihre Anwendung / Ihr Dienst den Vorgang, der in einen Ausnahmefall eingetreten ist, stoppt , wenn Sie nicht versuchen, in die Verwendung try / catch und Ausnahmen zum Implementieren des Kontrollflusses zu fallen .
Außerdem empfehle ich jedem, das von Martin Fowler veröffentlichte (und von Jim Shore geschriebene) Fail-Fast- Paradigma zu überprüfen . So habe ich immer verstanden, wie man mit Ausnahmen umgeht, noch bevor ich vor einiger Zeit zu diesem Dokument kam.
[...] betrachten sie als schwerwiegende Fehler ist ein völlig falsches Verständnis der Ausnahmen.
Normalerweise unterbrechen Ausnahmen den Betriebsablauf und werden so behandelt, dass sie in vom Menschen verständliche Fehler umgewandelt werden. Daher scheint eine Ausnahme tatsächlich ein besseres Paradigma zu sein, um Fehlerfälle zu behandeln und zu bearbeiten, um einen vollständigen Absturz von Anwendung / Dienst zu vermeiden und den Benutzer / Verbraucher darüber zu informieren, dass ein Fehler aufgetreten ist.
Weitere Antworten zu @ thewhiteambit-Bedenken
Zum Beispiel könnte das Programm im Falle einer fehlenden Datenbankverbindung ausnahmsweise mit dem Schreiben in eine lokale Datei fortfahren und die Änderungen an die Datenbank senden, sobald sie wieder verfügbar ist. Es könnte versucht werden, Ihr ungültiges String-To-Number-Casting erneut mit sprachlokaler Interpretation in Ausnahme zu analysieren, z. B. wenn Sie versuchen, die englische Standardsprache zu analysieren ("1,5"), schlägt dies fehl und Sie versuchen es erneut mit deutscher Interpretation, was vollständig ist gut, weil wir Komma anstelle von Punkt als Trennzeichen verwenden. Sie sehen, dass diese Ausnahmen nicht einmal blockiert werden dürfen, sondern nur eine Ausnahmebehandlung erfordern.
Wenn Ihre App möglicherweise offline funktioniert, ohne dass Daten in der Datenbank gespeichert werden, sollten Sie keine Ausnahmen verwenden , da die Implementierung des Kontrollflusses mithilfe von try/catch
als Anti-Pattern betrachtet wird. Offline-Arbeit ist ein möglicher Anwendungsfall. Sie implementieren also den Kontrollfluss, um zu überprüfen, ob auf die Datenbank zugegriffen werden kann oder nicht. Sie warten nicht, bis sie nicht mehr erreichbar ist .
Das Parsen ist auch ein erwarteter Fall ( kein AUSSERGEWÖHNLICHER FALL ). Wenn Sie dies erwarten, verwenden Sie keine Ausnahmen, um den Fluss zu steuern! . Sie erhalten vom Benutzer einige Metadaten, um zu wissen, was seine / ihre Kultur ist, und Sie verwenden dafür Formatierer! .NET unterstützt auch diese und andere Umgebungen und eine Ausnahme, da die Formatierung von Zahlen vermieden werden muss, wenn Sie eine kulturspezifische Nutzung Ihrer Anwendung / Ihres Dienstes erwarten .
Eine nicht behandelte Ausnahme wird normalerweise zu einem Fehler, aber Ausnahmen selbst sind nicht codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
Dieser Artikel ist nur eine Meinung oder ein Standpunkt des Autors.
Da Wikipedia auch nur die Meinung von Autoren sein kann, würde ich nicht sagen, dass es das Dogma ist , aber überprüfen Sie, was der Artikel Coding by Exception irgendwo in einem Absatz sagt:
[...] Die Verwendung dieser Ausnahmen zur Behandlung bestimmter Fehler, die beim Fortfahren des Programms auftreten, wird als Codierung nach Ausnahme bezeichnet. Dieses Anti-Pattern kann die Leistung und Wartbarkeit von Software schnell beeinträchtigen.
Es heißt auch irgendwo:
Falsche Verwendung von Ausnahmen
Oft kann das Codieren nach Ausnahmen zu weiteren Problemen in der Software mit falscher Ausnahmeverwendung führen. Zusätzlich zur Verwendung der Ausnahmebehandlung für ein eindeutiges Problem führt die falsche Verwendung von Ausnahmen dazu, dass Code auch nach dem Auslösen der Ausnahme ausgeführt wird. Diese schlechte Programmiermethode ähnelt der goto-Methode in vielen Softwaresprachen, tritt jedoch erst auf, nachdem ein Problem in der Software erkannt wurde.
Ehrlich gesagt glaube ich, dass Software nicht entwickelt werden kann, wenn Anwendungsfälle nicht ernst genommen werden. Wenn Sie das wissen ...
- Ihre Datenbank kann offline gehen ...
- Einige Dateien können gesperrt werden ...
- Einige Formatierungen werden möglicherweise nicht unterstützt ...
- Einige Domain-Überprüfungen schlagen möglicherweise fehl ...
- Ihre App sollte im Offline-Modus funktionieren ...
- welcher Anwendungsfall auch immer ...
... Sie werden dafür keine Ausnahmen verwenden . Sie würden unterstützen diese Anwendungsfälle mit regelmäßigen Kontrollfluss.
Und wenn ein unerwarteter Anwendungsfall nicht behandelt wird, schlägt Ihr Code schnell fehl, da eine Ausnahme ausgelöst wird . Richtig, denn eine Ausnahme ist ein Ausnahmefall .
Auf der anderen Seite und schließlich decken Sie manchmal Ausnahmefälle ab , die erwartete Ausnahmen auslösen , aber Sie werfen sie nicht aus, um den Kontrollfluss zu implementieren. Sie tun dies, weil Sie den oberen Ebenen mitteilen möchten, dass Sie einen Anwendungsfall nicht unterstützen oder Ihr Code mit bestimmten Argumenten oder Umgebungsdaten / -eigenschaften nicht funktioniert.