Ich verpasste immer einen eingebauten Ausnahme-Typ in C#, der anzeigen würde, dass ein Objekt beschädigt ist. Was werfen Sie in solchen Fällen?Welche Ausnahme wird auf ungültigen Objektstatus geworfen?
Normalerweise vermisse ich es, wenn ich feststelle, dass eine Methode, die an einem Objekt arbeiten soll, fehlschlagen würde, wenn das Objekt einen bestimmten Zustand hätte. In solchen Situationen vermute ich oft, dass dieser Zustand wahrscheinlich nie erreicht wird. Aber wenn ich mich in der Defensive befinde, würde ich gerne eine Ausnahme auslösen, falls dies der Fall sein sollte (z. B. nach einem zukünftigen Codewechsel).
Für Methodenargumente haben wir ArgumentException
, so dass wir ungültige Parameter verweigern können. Aber für den Objektstatus? In Java würde ich IllegalStateException
verwenden.
Natürlich könnte man argumentieren, dass die Methoden, die den Zustand tatsächlich ändern, auf die Korrektheit des Zustandes prüfen könnten. Und sie sollten besser, aber dann, wenn sie es nicht tun (sagen wir in alten Gottheiten)?
Edit:
Obwohl InvalidOperationException
scheint die beste Lösung zu sein, wie die akzeptierte Antwort Staaten (und auch this one), bitte beachten Sie:
Es ist subtil, aber semantisch hat dies eine andere Bedeutung als InvalidOperationException
. InvalidOperationException
zeigt ein Problem im "Protokoll" des Objekts an, das der Aufrufer befolgen muss (z. B. nicht initialisiert, bereits geschlossen, ...). In meinem Fall hat der Anrufer nichts falsch gemacht, es ist das Objekt, das kaputt ist. Ich möchte genau diese Nachricht transportieren.
Beispiel:
switch(this._someType) {
case SomeType.A: doSomething(); break;
case SomeType.B: doSomethingElse(); break;
/*...*/
default:
// Unexpected type! Someone introduced a new type and didn't update this.
throw new IllegalStateException("Unknown type "+this._someType);
}
Im Allgemeinen "InvalidOperationException". –
Bitte beachten Sie meinen Kommentar zu Matthew Watsons Antwort über 'InvalidOperationException'. –
Ein besseres Beispiel für das allgemeine Prinzip könnte sein, zu versuchen, ein Objekt zu einem Wörterbuch-Objekt hinzuzufügen, in dem eine interne verknüpfte Liste beschädigt wurde (z.B. aufgrund illegitimer Multithread-Verwendung). Normalerweise würde eine 'InvalidOperatonException', die von einer' Add'-Methode ausgelöst wird, anzeigen, dass ein Element mit dem angegebenen Schlüssel bereits hinzugefügt wurde, und Code, der eine solche Ausnahme abfängt, würde wahrscheinlich erwarten, dass dies wahr ist. Ich würde postulieren, dass es sehr schlecht ist, eine Ausnahme eines Typs zu werfen, der Erwartungen hat, wenn der Zustand eines Objekts nicht zu ihnen passt. – supercat