Ho sempre perso un tipo di eccezione built-in in C# che indica che un oggetto è danneggiato. Cosa butti in questi casi?Quale eccezione lanciare sullo stato dell'oggetto non valido?
Di solito mi manca quando mi rendo conto che un metodo, che dovrebbe funzionare su un oggetto, fallirebbe se l'oggetto avesse un certo stato. In tali situazioni, spesso sospetto che questo stato probabilmente non sarà mai raggiunto. Ma essendo difensivo a riguardo, vorrei lanciare un'eccezione nel caso in cui lo fosse (ad esempio dopo un futuro cambio di codice).
Per gli argomenti del metodo abbiamo ArgumentException
in modo da poter negare i parametri non validi. Ma per stato dell'oggetto? In Java userei IllegalStateException
.
Ovviamente si potrebbe obiettare che i metodi, che in realtà cambiano lo stato, potrebbero verificare la correttezza dello stato. E dovrebbero farlo meglio, ma poi se non lo fanno (diciamo nelle lezioni di Dio in eredità)?
Edit:
Anche se InvalidOperationException
sembra essere la soluzione migliore, come gli stati accettati risposta (e anche this one), si prega di notare:
E 'sottile, ma semanticamente questo ha un significato diverso di InvalidOperationException
. InvalidOperationException
indica un problema nel "protocollo" dell'oggetto, a cui il chiamante deve obbedire (ad es. Non inizializzato, chiuso già, ...). Nel mio caso il chiamante non ha fatto nulla di sbagliato, è l'oggetto che è rotto. Vorrei trasportare esattamente quel messaggio.
Esempio:
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);
}
Generalmente, 'InvalidOperationException'. –
Si prega di vedere il mio commento a Matthew Watsons risposta a 'InvalidOperationException'. –
Un esempio migliore per il principio generale potrebbe essere quello di cercare di aggiungere un elemento ad un oggetto dizionario-ish in cui un elenco collegato interno è corrotto (ad esempio a causa di un uso multi-thread illegittimo). Normalmente, una 'InvalidOperatonException' generata da un metodo' Add' indica che un elemento con la chiave indicata è già stato aggiunto e il codice che cattura tale eccezione probabilmente si aspetta che sia vero. Direi che è pessimo gettare un'eccezione di un tipo che ha associato aspettative quando lo stato di un oggetto non le soddisfa. – supercat