Soll ich eine NotImplementedException()
auf default
werfen, wenn ich Fälle für alle möglichen Aufzählungstypen habe?
Wenn Sie nach einem Wert suchen, der muss per Definition dem Wert einer Aufzählung entsprechen muss und Sie etwas anderes erhalten haben, ist das definitiv ein ungültiges Argument.
Aber jetzt müssen Sie den Kontext berücksichtigen.
Ist die Methode privat und nur für Mitglieder Ihrer Klassenbibliothek oder Anwendung zugänglich? Wenn dies der Fall ist, handelt es sich um einen Codierungsfehler, der nicht unbedingt auftreten sollte. Bestätigen und fehlschlagen.
Wenn es andererseits eine öffentliche oder geschützte Methode ist und auf die Clients zugreifen können, die Ihre Bibliothek benutzen, sollten Sie auf jeden Fall eine aussagekräftige Nachricht (und vorzugsweise einen bekannten Ausnahme-Typ) verwenden.
Es ist wichtig zu beachten, dass Aufzählungen im Framework nicht bereichsüberprüft werden. Ich kann angeben, dass für eine Methode ein Parameter vom Typ Environment.SpecialFolder benötigt wird. aber es akzeptiert beliebige 32-Bit-Integer-Werte.
Also, kurz gesagt, wenn Ihre Methode für den öffentlichen Konsum ist, ja, auf jeden Fall, werfen. Wenn es nicht für den öffentlichen Verbrauch ist, Bestätigen .
Es kommt wirklich darauf an.
Die NotImplementedException ist etwas wie Todo-Zeichen für mich. Es bedeutet, dass jemand später kommt, um den Code zu beenden. Ich denke jedoch nicht, dass es sich um einen Standardfall handelt, der nicht passieren sollte.
Wenn Sie den Status des Objekts überprüfen, können Sie InvalidOperationException in Erwägung ziehen . Ihre Methode wurde nur für die Arbeit mit bestehenden Fällen entwickelt.
Wenn Sie den Eingabeparameter ArgumentException diskriminieren, ist dies immer angemessen.
In anderen Fällen bevorzuge ich NotSupportedException . Es zeigt leicht an, dass etwas mit Plattform oder Version nicht stimmt. Und die inkompatiblen Versionen des Codes sind die wahre Wurzel des Problems, wenn der Standardfall des Switches, der nicht passieren sollte, passiert ist.
Vielleicht nicht NotImplementedException, aber ArgumentException. Es hängt wirklich davon ab, wo Sie es verwenden.
Ich würde ApplicationException
ausgeben, denn wenn Ihr Code den Standard erreicht und Sie dies nicht erwartet haben, bedeutet das, dass etwas in Ihrem Code sich nicht so verhält wie Sie denken.
Wenn Sie die Ausnahme geworfen haben, was würde passieren? In welchem Kontext wird die switch-Anweisung ausgeführt? Sollte diese Situation jemals passieren? Sollte es jemals zur Laufzeit im Produktionscode passieren? Bedecken Ihre Unit-Tests diese Situation? Wenn ja, wäre vielleicht eine Aussage besser.
Sie sollten zuerst überlegen, was es bedeuten würde, wenn Sie einen Wert außerhalb der bekannten Fälle erhalten würden - was bedeutet die Variable, die eingeschaltet ist? Dann können Sie einfach einen Ausnahmetyp verwenden, der zu dem passt, was tatsächlich passiert.
Ich würde zumindest sagen, dass du dort ein Debug.Fail()
setzen solltest.
Sie sollten eine Ausnahme auslösen, falls die Methode in keiner Weise fortgesetzt werden kann. Wenn Sie jedoch Ihre enum-Werte in Zeichenfolgendarstellungen konvertieren möchten, können Sie stattdessen nur eine Warnungszeichenfolge zurückgeben. Das Produkt wird aufgrund eines offensichtlichen Fehlers nicht auf Benutzer abstürzen, es wird wahrscheinlich einen Workaround geben und jeder wird glücklich sein.
Tags und Links c# exception switch-statement