Удивительно, но мне удалось найти только один предыдущий вопрос на SO по этому вопросу, и я просто хотел бы получить от сообщества «Голос доверия» (или нет!) На моем подходе.
Я вижу это так:
- используйте
Debug.Assert
, чтобы утверждать, что вы ОЖИДАЕТЕ, что это правда. Это будет использоваться, когда мы полностью контролируем нашу среду, например, в методе
проверьте некоторые предварительные и последующие условия.
- использовать исключения, когда возникают исключительные обстоятельства. Работать с внешними ресурсами, то есть файлами, базами данных, сетями и т. Д., Не составляет труда. Но ...
В следующем сценарии становится немного мутно. Обращаем ваше внимание, что это ПРИЕМНЫЙ ПРИМЕР только для иллюстрации!
Допустим, у нас есть класс MyClass, который имеет открытое свойство MyMode и метод GetSomeValueForCurrentMode()
. Рассматривайте MyClass как предназначенный для отправки (сборки выпуска) в библиотеку для использования другими разработчиками.
Мы ожидаем, что MyMode будет обновляться внешними пользователями этого класса. Теперь GetSomeValueForCurrentMode()
имеет следующую логику:
switch(MyMode)
{
case Mode.ModeA:
return val1;
case Mode.ModeB:
return val2;
default:
//Uh-uh this should never happen
}
Я получаю здесь то, что пользователь MyClass оставил его в недопустимом состоянии. Так что же нам делать?
По умолчанию мы должны Debug.Assert
или throw new InvalidOperationException
(или другие)?
Есть одна мантра, которая говорит, что мы не должны доверять пользователям наших классов. Если мы выберем Debug.Assert и соберем MyClass в качестве сборки выпуска (тем самым удалив Debug Asserts), пользователь класса не получит полезную информацию о том, что он оставил его в недопустимом состоянии. Но это в некотором роде противоречит другой мантре, которая гласит, что выбросить исключения можно только тогда, когда происходят события, совершенно не зависящие от вас.
Я обнаружил, что схожу по кругу с этим - одним из тех дебатов по программированию, который, кажется, не имеет однозначного «правильного» ответа. Итак, давайте поставим это на голосование!
Редактировать: я заметил этот ответ в связанном вопросе SO ( Проектирование по контракту с использованием утверждений или исключений? ):
Практическое правило заключается в том, что вы должны использовать утверждения, когда вы пытаетесь отследить свои собственные ошибки, и исключения, когда вы пытаетесь отследить ошибки других людей. Другими словами, вы должны использовать исключения для проверки предварительных условий для функций публичного API и всякий раз, когда вы получаете какие-либо данные, которые являются внешними по отношению к вашей системе. Вы должны использовать утверждения для функций или данных, которые являются внутренними для вашей системы.
Для меня это имеет смысл, и его можно сочетать с техникой «Утверждай, затем брось», описанной ниже.
Мысли приветствуются!