Verwendung von NotImplementedException

15

Wird es als schlechte Praxis angesehen, NotImplementedExceptionCode zu werfen , den Sie noch nicht geschrieben haben? Möglicherweise wären TODO-Kommentare sicherer?

Tom Squires
quelle
6
Was wäre der Nachteil, wenn Sie solche Ausnahmen nutzen würden?
SRKX
@SRKX Es besteht die Gefahr, dass Ausnahmen in den Produktionscode gelangen und der gesamte Codeblock nicht funktioniert. (ist mir noch nicht passiert, aber wir haben alle freie Tage) Ich persönlich benutze sie, ich befürchtete, ich hätte einige Nachteile übersehen können.
Tom Squires
Seltsamerweise gibt keiner der Tags an, welche Sprache verwendet wird. Dies gilt nicht für alle gängigen Sprachen, da C keine Ausnahmen hat. Hier ist Platz für ein Sprachtag, Leute.
David Thornley
1
@DavidThornley, die Frage war ursprünglich mit C # markiert, also habe ich das Tag gelesen.
Svick
@svick: Dachte, es war wahrscheinlich C #. Vielen Dank für das Hinzufügen des Tags.
David Thornley

Antworten:

34

Ich glaube, das NotImplementedExceptionist eine gute Praxis.

Wenn Sie vergessen, eine Methode zu implementieren, und Sie sie später in Ihrem Projekt verwenden (und glauben Sie mir, es passiert), verbringen Sie möglicherweise viel Zeit mit der Fehlersuche, um herauszufinden, was Schritt für Schritt schief gelaufen ist. Wenn Sie die Ausnahme haben, stoppt das Programm direkt und fordert die Ausnahme auf (wenn Sie die Ausnahme abfangen, finden Sie sie schnell, indem Sie nach der Ausnahme suchen, die Sie abgefangen haben).

Ich würde empfehlen, die mit TODO NotImplementedException kombinierten Kommentare zu verwenden, um die GUI-Hilfe (mit den Aufgaben in VS) und die Programmsicherheit zu kombinieren.

Für die Release-Version ist es meiner Meinung nach sogar noch wichtiger, da Sie es in den meisten Fällen vorziehen, wenn Ihr Programm abstürzt, anstatt dass ein Programm anscheinend ordnungsgemäß funktioniert, aber fehlerhafte Ergebnisse liefert.

SRKX
quelle
6
Wenn Sie Resharper verwenden, wird NotImplementedExceptions wie in TODO-Kommentaren angezeigt . Ich finde das eine nette Funktion.
Svick
1
Wenn Sie ein gutes TDD-Training absolvieren, haben Sie einen Gewinner
LRE
7

Es hängt von Ihrer allgemeinen Philosophie in Bezug auf Fehler und Fehlerbehandlung ab. Ich bin der "harte Fehler" -Typ: Ich werde beim geringsten Hinweis darauf, dass etwas nicht stimmt, eine Ausnahme auslösen. Ich werde alles behaupten; Wenn es einen Fehler gibt, wenn erwartet wurde, dass etwas da ist und es nicht ist oder wenn etwas da ist und es nicht sollte, muss das gesamte Universum aufhören. Das Ausrufezeichen des Fensters muss unheilvoll über die Lautsprecher klingeln.

Es gibt andere Leute, die sich lieber nicht mit Fehlern belästigen lassen. Was ist, wenn wir es an den Client senden und das gesamte Berichtsmodul fehlt, weil wir vergessen haben, es zu codieren, und niemand beim Testen es bemerkt hat, weil die Anwendung zu leise darüber war? Tun Sie lieber nichts, als dem Kunden eine Ausnahme ins Gesicht zu werfen!

Mike Nakis
quelle
Es ist, als ob Sie ein anderes Verhalten in Debug und Release wünschen würden, und eine Behauptung wird dies nicht immer verhindern. Ich glaube .Net-Code-Verträge können in Release deaktiviert werden.
Job
1
Ich verwende meistens Behauptungen, die auch im Release deaktiviert sind. Ich habe meine eigene Assertion-Funktion, die beim Debuggen einen Haltepunkt erreicht, beim Testen eine Ausnahme auslöst oder beim Release nicht einmal kompiliert.
Mike Nakis
3

Ich würde sagen, es ist eine gute Idee. Normalerweise sehe ich diese Ausnahmen, die durch einen Code ausgelöst werden, der automatisch aus einem Formular oder Diagramm oder etwas anderem generiert wird. Die Ausnahme erinnert mich daran, den Code zu implementieren, und stellt sicher, dass Fehler auftreten, wenn ich versuche, die Funktionalität zu verwenden, die eingerichtet wurde, aber nie vollständig implementiert wurde. Manchmal stoppe ich es oder ersetze es durch etwas, bei dem die Ausführung weniger wahrscheinlich ist (z. B. das Drucken einer Warnung an die Konsole), aber ich stelle fest, dass es für mich funktioniert.

Wenn Sie eine Bibliothek erstellen, die von anderen verwendet wird, ist diese Ausnahme besser als die Alternative, bei der ein Benutzer Ihrer Bibliothek eine Funktion aufruft und sich fragt, warum anscheinend nichts passiert. Natürlich ist es immer noch ziemlich schlimm, diese Ausnahme in einer ausgelieferten Bibliothek zu haben, aber besser als stille Fehler, IMO.

FrustratedWithFormsDesigner
quelle
1

Ich denke, es ist eine gute Übung. Die Alternative ist die Weitergabe eines ungültigen Werts oder Status, der sich sowohl auf den Test- als auch auf den Produktionscode auswirkt.

Larry OBrien
quelle
1
Warte ... du meinst, wo du arbeitest, Code, der NotImpl auslöst, würde es bis zur Qualitätssicherung schaffen? Auch in die Produktion?
Steven Evers
3
Nein, genau das Gegenteil: Ein NotImpl ist eine schöne enorme rote Fahne / Fehlerbedingung. Aber TODOs haben keinen semantischen Wert und können es zu einem Test oder einer Produktion machen, indem sie die Dinge leise vermasseln. (Ich könnte mir vorstellen, TODOs aus der Produktion zu streichen, aber wir haben keine solche Regel.)
Larry OBrien
1

Ich benutze immer NotImplementedException- dafür ist es schließlich.

Dies hängt mit dem Konzept des schnellen Ausfalls zusammen: Wenn Ihr Code eine Ausnahme auslöst, sollte diese abgefangen werden, bevor Sie in die Produktion gehen. Wenn es zur Produktion kommt, dann weiß zumindest der Kunde, dass die Montage nicht korrekt ist .

Wenn der Code einen bedeutungslosen Wert zurückgibt oder für voidMethoden keine Aktion ausführt, denken die Benutzer Ihres Codes möglicherweise, dass der Aufruf sinnvoll war, als er nicht war. Wenn sie dann später einen korrekten Code erhalten, kann dieser Code beschädigt werden, da er vom früheren falschen Verhalten abhängt.

phoog
quelle
0

Was für ein Projekt ist das? Arbeit oder zu Hause? Machen Sie zu Hause, was Sie wollen - was Sie am besten daran erinnert, dass Sie fertig sein müssen, woran Sie gerade arbeiten.

Schreibe es bei der Arbeit zu Ende.

Ich kann keine Situation sehen, in der ich Code einchecken würde, der andere Entwickler, QA oder einen Build beschädigen kann / wird.

Steven Evers
quelle
Nun, ich versuche, auch zu Hause gute Praktiken einzuhalten.
Tom Squires
0

Ich mache beides ich mache aber ein \ todo in meinem doxygene autodocing und werfe dann die ausnahme. Auf diese Weise können Leute, die sich nicht um RTFM kümmern müssen, herausfinden, warum ihr Programm abgestürzt ist, anstatt sich zu fragen, warum es eine deklarierte Funktion gibt, die keinen logischen Wert zurückgibt.

awiebe
quelle