NotImplementedException für Standardfall in switch-Anweisung werfen

9

Soll ich eine NotImplementedException() auf default werfen, wenn ich Fälle für alle möglichen Aufzählungstypen habe?

    
JamesBrownIsDead 10.11.2009, 17:55
quelle

10 Antworten

13

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 .

    
Mike Hofer 10.11.2009, 18:12
quelle
5

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.

Jakub Šturc 10.11.2009 18:15
quelle
4

Vielleicht nicht NotImplementedException, aber ArgumentException. Es hängt wirklich davon ab, wo Sie es verwenden.

    
Yuriy Faktorovich 10.11.2009 17:58
quelle
2

Das klingt nach einer vernünftigen Option.

Persönlich würde ich einen neuen Typ von Ausnahme erstellen (vielleicht ein InvalidEnumException oder gebe ihm einen anderen Namen, der für das Support-Team Sinn macht) und das werfen.

    
David 10.11.2009 17:57
quelle
1

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.

    
David Espart 10.11.2009 17:57
quelle
1

Es hängt wirklich von Ihrem Anwendungsfall ab. Es wird hilfreich sein, wenn Sie in den frühen Tagen der Integration eine Ausnahme auslösen. Die Benutzer Ihrer Bibliothek können die Fehler sofort erkennen

    
aJ. 10.11.2009 17:58
quelle
0

Es kommt wirklich auf den spezifischen Prozess an, aber ja, es ist ein guter Prozess, um im Standardfall zu reagieren: Falls etwas nicht dort sein sollte.

    
C. Ross 10.11.2009 17:56
quelle
0

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.

    
user113476 10.11.2009 18:00
quelle
0

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.

    
Brian Schroth 10.11.2009 18:01
quelle
0

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.

    
Max Galkin 10.11.2009 17:57
quelle

Tags und Links