Я бы обычно выбрасывал InvalidOperationException
или ArgumentOutOfRangeException
в зависимости от того, откуда пришло значение.
В качестве альтернативы есть Debug.Assert
(который завершится ошибкой только тогда, когда вы определили символ препроцессора DEBUG) или в .NET 4.0 вы можете использовать Contract.Fail
, Contract.Assert
или Contract.Assume
в зависимости от ситуации. Явное создание исключения имеет то преимущество, что компилятор знает, что следующий оператор недостижим.
Я не большой поклонник Debug.Assert
- он обычно не подходит для релиза (так как он выдает окно подтверждения, а не просто проваливается) и по умолчанию он не будет запускаться при выпуске в любом случае. Я предпочитаю исключения, которые всегда генерируются, поскольку они препятствуют выполнению вашего кода независимо от возможности обнаружить, что «что-то не так».
Code Contracts несколько меняет игру, так как существуют разные варианты того, что сохраняется во время выполнения, и статическая проверка может помочь доказать, что вы не попадете в это состояние. Вам все еще нужно выбрать политику времени выполнения, хотя ...