Zawsze brakowało mi wbudowanego typu wyjątku w języku C#, który wskazywałby, że obiekt jest uszkodzony. Co rzucasz w takich przypadkach?Jaki wyjątek do rzucania na nieprawidłowy stan obiektu?
Zwykle tęsknię za tym, gdy zdaję sobie sprawę, że metoda, która ma działać na obiekcie, zakończyłoby się niepowodzeniem, gdyby obiekt miał określony stan. W takich sytuacjach często podejrzewam, że ten stan prawdopodobnie nigdy nie zostanie osiągnięty. Ale będąc w defensywie, chciałbym rzucić wyjątek na wszelki wypadek (np. Po zmianie kodu w przyszłości).
Dla argumentów metody mamy ArgumentException
, więc możemy odmówić nieprawidłowe parametry. Ale dla stanu obiektu? W Javie użyłbym IllegalStateException
.
Oczywiście można argumentować, że metody, które faktycznie zmieniają stan, mogą sprawdzić poprawność stanu. I lepiej, powinniśmy, ale jeśli nie (powiedzmy w starszych klasach boga)?
Edit:
Chociaż InvalidOperationException
wydaje się być najlepiej nadających się przyjętych państw Odpowiedź (a także this one) uwaga:
To jest subtelna, ale semantycznie to ma inne znaczenie niż InvalidOperationException
. InvalidOperationException
oznacza problem z "protokołem" obiektu, którego osoba wywołująca musi przestrzegać (np. Nie została zainicjowana, zamknięta, ...). W moim przypadku dzwoniący nie zrobił nic złego, jest to obiekt, który jest zepsuty. Chciałbym przetransportować dokładnie tę wiadomość.
Przykład:
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);
}
Ogólnie "InvalidOperationException". –
Proszę zobaczyć mój komentarz do odpowiedzi Matthew Watsonsa na temat 'InvalidOperationException'. –
Lepszym przykładem dla ogólnej zasady może być próba "dodania" elementu do obiektu słownikowego, w którym wewnętrznie połączona lista została uszkodzona (np. Z powodu nieuprawnionego użycia wielowątkowego). Normalnie, 'InvalidOperatonException' wyrzucony z metody' Add' oznaczałby, że element ze wskazanym kluczem został już dodany, a kod, który wychwytuje taki wyjątek, prawdopodobnie oczekiwałby, że jest prawdziwy. Zakładam, że bardzo źle jest rzucić wyjątek typu, który wiąże się z oczekiwaniami, gdy stan obiektu nie pasuje do nich. – supercat