Ich habe eine Klasse erstellt, die ein Dokument aus einer Datei analysiert.
%Vor%Manchmal kann es in diesem Fall Parsing-Fehler geben bestimmte Daten zurückgeben. Ich habe dafür eine spezielle Klasse erstellt.
%Vor%Wie kann ich solche Fehler richtig behandeln? Ich habe mindestens zwei Optionen:
Erstellen Sie meine eigene Ausnahme oder Rückgabewert.
Option eins
%Vor%Option Zwei
%Vor%AKTUALISIEREN
Wenn ich mich nicht irre, ist die Ideologie hinter der Ausnahme, dass sie sich mit etwas Außergewöhnlichem befassen sollte, das ist eine Situation, mit der die Methode nicht umgehen soll.
Das bringt mich dazu, mich zu fragen, ob zum Beispiel:
Der Parser findet ein unbekanntes Feld in der Datei oder die Codierung ist falsch
wäre das ein Ausnahmefall?
Denken Sie daran, wie typisch es ist, einen Parsing-Fehler zu haben. Wenn es typisch ist - bevorzugen Sie einen Rückgabewert. Ausnahmen sollten für Dinge verwendet werden, die nicht normal sind.
Die .NET-Länderphilosophie zu Ausnahmen unterscheidet sich ein wenig von anderen Plattformen. Es dauert nicht lange in .NET Land zu erkennen, dass Sie nicht mehr in OZ sind, und dass Ausnahmen oft geworfen werden.
Von MSDN auf .NET 4: Gib keine Fehlercodes zurück. Ausnahmen sind das primäre Mittel zur Meldung von Fehlern in Frameworks.
Von MSDN auf .NET 4.5: Eine Ausnahme ist eine Fehlerbedingung oder ein unerwartetes Verhalten, das von einem ausgeführten Programm festgestellt wird.
Ein Beispiel geben sie, wenn ein Client keine Verbindung zu einem Endpunkt herstellen kann. Wenn Sie also in Betracht ziehen, dass Websites manchmal aus Gründen der Vernetzung oder aus anderen Gründen nicht verfügbar sind, was nicht ganz der traditionellen Definition von "außergewöhnlich" entspricht, können Sie ein Gefühl dafür bekommen, wie die Entwickler Ausnahmen verwenden möchten.
Ich würde mit Option drei gehen
%Vor%Hier kann ParseResult mehr Details über das Ergebnis des Parsens liefern, sowohl positive als auch negative.
Wenn die Fehlerbedingung sehr selten ist und als unerwartetes Ergebnis betrachtet würde, würde ich Ihre Option zwei wählen und eine Ausnahme auslösen. Natürlich könnte die endgültige Lösung eine Kombination sein, bei der allgemeine Fehler in ParseResult zurückgegeben werden, aber außergewöhnliche Bedingungen wie das Fehlschlagen des Öffnens der Datei usw. als Ausnahmen auftreten.
Das hängt davon ab, ob die MyParsingException nur eine abgeleitete Klasse von System.Exection ist oder ob sie zusätzliche Informationen darüber enthält, was beim Analysieren der Datei falsch gelaufen ist. Wenn es keine solche Information gibt, dann denke ich, dass die Parse-Methode vielleicht eine Zeichenkette oder Null zurückgeben sollte, wenn ein Fehler auftrat:
%Vor%oder, wenn die Ausnahme wirklich hilfreich ist, enthält Informationen über die Datei (Name), Zeilennummer ... etc:
%Vor%Fehler-Flags oder Rückgabewerte sind im Allgemeinen besser, wenn der unmittelbare -Aufrufer mit der ungültigen Bedingung umgehen soll. Ausnahmen sind im Allgemeinen besser in Fällen, in denen es viele Funktionsaufrufe geben wird, die auf eine bestimmte Art und Weise ausfallen können, und die Fehlerbehandlung für alle diese Funktionsaufrufe sollte identisch sein.
Oftmals kann der Autor einer Methode nicht wissen, welches Szenario auf seine Aufrufer zutrifft (tatsächlich ist es üblich, dass einige Anrufer besser zu einem Muster passen und einige andere). Die bevorzugte Vorgehensweise von Microsoft ist die Verwendung des Musters:
%Vor% Das ist sicherlich ein besseres Konzept, als Anrufer auf das eine oder andere Muster zu beschränken, obwohl mir die bestimmte Implementierung nicht gefällt. Microsoft empfiehlt ausdrücklich, separate Methoden zu verwenden, anstatt eine Methode mit einem Parameter zu verwenden, der angibt, ob ein Fehler eine Ausnahme auslösen sollte, aber diese Philosophie hat ihren Preis: Das bedeutet, wenn einer der Schritte GetThing
oder TryGetThing
ausführen kann mit einer "do" oder "try" -Methode durchgeführt werden, muss der Code für GetThing
und TryGetThing
weitgehend dupliziert werden, wobei einer "do" -Methoden aufruft und der andere "try" -Methoden aufruft.
Ein alternativer Ansatz wäre, ein Objekt vom Typ delegate oder interface zu haben, das angibt, was eine "try" -Methode tun soll, wenn eine Ausnahme auftritt. Zum Beispiel könnte man eine Funktion haben:
%Vor% möglicherweise mit einer Überladung, die, wenn die letzten beiden Parameter weggelassen werden, das obige mit true
für ThrowOnError
und eine Dummy-Variable für errInf
aufruft. Wenn die von TryGetThing
verwendeten Methoden einem ähnlichen Muster folgen, können sie möglicherweise aufgerufen werden, ohne Code für die try / do-Fälle duplizieren zu müssen.
Wenn Ihre API angibt, dass sie die Analyse von Fehlern handhabt, dann handelt es sich nicht um eine Ausnahmesituation und möglicherweise sollten Analysefehler zurückgegeben werden. Für andere Dinge, wie fehlende Dateien, gesperrte Dateien, ungültige Eingaben (außer fragwürdigem Parsen), sollten Sie Ausnahmen auslösen.
Für mich hängt es davon ab, wie ich den Fehler konsumieren will und welche Art von Fehler das ist. Der Kontext der Methode spielt ebenfalls eine Rolle. Wenn die Methode einen Fehler in der XML-Datei ab und zu erwartet, dann ist das in meinen Augen keine Ausnahme und sollte entsprechend behandelt werden.
Nehmen wir an, ich schreibe einen XML-Validator, dann ist es ein Fehler, den Fehler zu beheben. Wenn ich einen XML-Konfigurationsparser schreibe, erscheint eine Ausnahme geeigneter.
Tags und Links c# exception-handling architecture