Welche Art von Ausnahme wird ausgelöst?

7

Welcher type of exception würden Sie aus einer schreibgeschützten Eigenschaft auslösen, wenn das Objekt, das zum Zurückgeben des Werts verwendet wird, null ist

%Vor%     
Sheraz 07.01.2011, 15:28
quelle

8 Antworten

7

An InvalidOperationException ist Was würde ich in diesem Fall verwenden, weil der Zugriff auf die Eigenschaft nicht für den aktuellen Zustand des Objekts gültig ist.

Laut MSDN-Dokumentation:
"Die Ausnahme, die ausgelöst wird, wenn ein Methodenaufruf für den aktuellen Status des Objekts ungültig ist."

auch:
"InvalidOperationException wird in Fällen verwendet, in denen der Fehler beim Aufrufen einer Methode auf andere Gründe als ungültige Argumente zurückzuführen ist."

In diesem Fall ist obj kein Argument, weshalb ich auf "InvalidOperationException"

lehnen würde

Der Grund, warum ich hier keine NullReferenceException werfen würde: Wenn Sie keinen speziellen Code hinzufügen, ist das die Ausnahme, die ".Net" werfen würde. Warum also redundanten Code hinzufügen?

    
Raj Rao 07.01.2011, 15:41
quelle
9

Ich würde ein InvalidOperationException werfen.

ArgumentNullException Ich werfe nur dann, wenn Methodenparameter null sind.

Wenn der Methodenparameter in einem ungültigen Zustand ist, werfe ich einen ArgumentException .

    
Khh 07.01.2011 15:34
quelle
4

Sie sollten keine NullReferenceException werfen. Es ist für Situationen reserviert, in denen ein Nullobjekt dereferenziert wird. Wenn Sie in diesem Fall NullReference werfen, können Sie auch einfach den Null-Check verlassen und das Framework für Sie freigeben lassen, wenn Sie versuchen, auf den Namen des Objekts zuzugreifen.

Ich würde stattdessen InvalidOperationException auslösen.

    
Adam Lear 07.01.2011 15:34
quelle
2

Wenn Sie nicht irgendwo sagen, dass diese Eigenschaft nie null sein wird, warum sollten Sie eine Ausnahme auslösen?

Wenn Sie das gesagt haben, würde ich eine InvalidOperationException .

InvalidOperationException ist

  

Die Ausnahme, die ausgelöst wird, wenn a   Methodenaufruf ist ungültig für die   aktueller Status des Objekts.

    
Powerlord 07.01.2011 15:33
quelle
2

Jeder hat das Offensichtliche abgedeckt, also hier ist eine andere Option.

Wenn Ihre Klasse auf irgendeine Weise initialisiert werden muss (Ihr SomeObject muss irgendwann gesetzt werden), sollten Sie in Erwägung ziehen, ISupportInitialize . Dies zeigt Benutzern Ihrer Klasse an, dass sie sich vor dem Aufruf von EndInit() nicht in einem gültigen Status befindet. Leider gibt es kein vorheriges allgemeines NotInitializedException , das Sie verwenden können (es gibt einige, die aber für bestimmte Namespaces spezifisch sind), daher würde ich vorschlagen, Ihre Implementierung der Schnittstelle mit der Erstellung einer solchen Ausnahme zu paaren.

Benutzer müssen zuerst BeginInit() aufrufen, dann die Instanz konfigurieren und dann EndInit() aufrufen. Überprüfen Sie beim Aufruf von EndInit() den Status Ihrer Instanz. Wenn es nicht korrekt initialisiert wird, können Sie eine InvalidOperationException auslösen. Wenn Benutzer versuchen, Ihre Instanz vor der Initialisierung zu verwenden, würden Sie Ihre NotInitializedException auslösen.

Es ist ein bisschen mehr Arbeit, aber der Vorteil ist, dass Sie eine breitere "Grube des Erfolges" für Ihre Benutzer schaffen, um sicherzustellen, dass sie Ihre Klassen richtig verwenden, indem sie schnell und früh ausfallen, und durch die Definition Ihres Typs Schnittstelle ist ziemlich klar, was Sie erwarten). Es gibt Ihnen auch mehr "Raum", um zu dokumentieren, wie Ihre Klasse verwendet werden sollte.

    
Will 07.01.2011 15:52
quelle
1

Ich würde ein InvalidOperationException werfen, aber nur wenn: - Es ist zulässig, dass obj null ist, und es liegt in der Verantwortung des Benutzers, dies zu überprüfen, oder - Es ist nicht zulässig, dass obj zuerst null ist (d. h. obj != null ist eine Klasseninvariante)

Wenn keiner der obigen Fälle der Fall ist (das heißt, es ist legal, dass obj null ist und Benutzercode nicht explizit erforderlich ist, um dies zu überprüfen, bevor die Eigenschaft verwendet wird), würde ich nicht werfen Sie überhaupt, aber geben Sie null zurück.

    
tdammers 07.01.2011 15:36
quelle
1

Wenn Sie sich den von Ihnen bereitgestellten Code anschauen und nichts über Ihre Designannahmen wissen, würde ich sagen, dass Sie obj == null überhaupt nicht testen sollten und das Framework ein NullReferenceException werfen lassen sollte. Warum willst du diesen Test? Ein Grund, an den ich denken könnte, ist, dass Sie eine aussagekräftigere Fehlermeldung zum Debuggen haben möchten, aber dann sollten Sie Debug.Assert(obj != null, "Your message here") verwenden.

    
TomBot 07.01.2011 16:30
quelle
1

Ich würde den Entwurf erneut besuchen, so dass dieser Zustand nicht in erster Linie existieren kann, d. h. obj ist null. Im Allgemeinen sollte man aus Sicht der API in der Lage sein, einen Getter in gutem Glauben aufzurufen, dass er nicht explodieren wird, wenn sich das Objekt in einem unbekannten Zustand befindet.

Warum haben Sie zum Beispiel 'SomeObject obj' nicht als Konstruktorparameter und verwenden Argumentvalidierung zum Zeitpunkt der Konstruktion. Dadurch wird sichergestellt, dass der Zustand von 'obj' immer korrekt ist, d. H. Nach der Konstruktion nicht null ist.

Es gibt viele Muster, die verwendet werden können, um sicherzustellen, dass ein Objekt einen korrekten Status hat, wenn es für den Benutzer verfügbar wird.

    
Tim Lloyd 07.01.2011 15:41
quelle

Tags und Links