Das Lesen des Artikels von Eric Lippert über Ausnahmen war definitiv ein Augenschmaus darüber, wie ich mit Ausnahmen umgehen sollte, sowohl als Produzent als auch als Verbraucher. Ich kämpfe jedoch immer noch darum, eine Richtlinie zu definieren, wie man lästige Ausnahmen vermeiden kann.
Speziell:
- Angenommen, Sie haben eine Speichermethode, die fehlschlagen kann, weil a) jemand anderes den Datensatz vor Ihnen geändert hat oder b) der Wert, den Sie erstellen möchten, bereits vorhanden ist . Diese Bedingungen sind zu erwarten und nicht außergewöhnlich. Anstatt eine Ausnahme auszulösen, erstellen Sie eine Try-Version Ihrer Methode, TrySave, die einen Booleschen Wert zurückgibt, der angibt, ob das Speichern erfolgreich war. Aber wenn es fehlschlägt, wie wird der Verbraucher wissen, was das Problem war? Oder ist es am besten, eine Aufzählung mit dem Ergebnis "Ok / RecordAlreadyModified / ValueAlreadyExists" zurückzugeben? Mit integer.TryParse existiert dieses Problem nicht, da es nur einen Grund gibt, warum die Methode fehlschlagen kann.
- Ist das vorige Beispiel wirklich eine ärgerliche Situation? Oder wäre es in diesem Fall die bevorzugte Methode, eine Ausnahme auszulösen? Ich weiß, dass dies in den meisten Bibliotheken und Frameworks, einschließlich des Entity-Frameworks, der Fall ist.
- Wie können Sie entscheiden, wann Sie eine Try-Version Ihrer Methode erstellen möchten, anstatt im Voraus zu testen, ob die Methode funktioniert oder nicht? Ich folge derzeit diesen Richtlinien:
- Wenn die Möglichkeit einer Racebedingung besteht, erstellen Sie eine Testversion. Dies verhindert, dass der Verbraucher eine exogene Ausnahme abfangen muss. Zum Beispiel in der zuvor beschriebenen Save-Methode.
- Wenn die Methode zum Testen der Bedingung so gut wie alles tun würde, was die ursprüngliche Methode tut, erstellen Sie eine Try-Version. Zum Beispiel integer.TryParse ().
- Erstellen Sie in jedem anderen Fall eine Methode zum Testen der Bedingung.