Я всегда пропускал встроенный тип исключения в С#, который указывал бы, что объект поврежден. Что вы бросаете в таких случаях?
Обычно я пропускаю это, когда понимаю, что метод, который должен работать на объекте, потерпит неудачу, если объект имеет определенное состояние. В таких ситуациях я часто подозреваю, что этого состояния, вероятно, никогда не достигнут. Но, защищаясь, я хотел бы сделать исключение на случай, если это произойдет (например, после изменения будущего кода).
Для аргументов метода мы имеем ArgumentException
, чтобы мы могли отрицать недопустимые параметры. Но для состояния объекта? В Java я бы использовал IllegalStateException
.
Конечно, вы можете утверждать, что методы, которые фактически меняют состояние, могут проверять правильность состояния. И они лучше должны, но тогда, если они этого не сделают (скажем, в унаследованных божественных классах)?
Edit:
Несмотря на то, что InvalidOperationException
кажется наилучшим, поскольку принятый ответ содержит (а также этот), обратите внимание:
Это тонкий, но семантически это имеет другое значение, чем InvalidOperationException
. InvalidOperationException
указывает на проблему в "протоколе" объекта, который вызывающий должен подчиняться (например, не инициализирован, уже закрыт,...). В моем случае вызывающий не сделал ничего плохого, это объект, который сломан. Я хотел бы передать именно это сообщение.
Пример:
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);
}