Когда использовать утверждение поверх исключений в классах домена

StackOverflow https://stackoverflow.com/questions/414182

Вопрос

Существуют ли какие-либо ситуации, когда вы использовали бы assertion вместо обработки исключений внутри классов домена?..

Это было полезно?

Решение

Используйте исключения для проверки параметров и других проверок, которые проверяют, что пользователи ваших классов используют их по назначению.

Используйте утверждения для внутренней проверки согласованности, т. е. чтобы указать, что вы облажались, а не пользователь вашего класса.

Таким образом, если пользователи вашего класса видят ошибку подтверждения, они знают, что это (вероятно) внутренняя ошибка в вашем коде, а не в использовании вашего кода. С другой стороны, если исключение проверки параметров get, они знают, что это их ошибка.

Другие советы

Никогда.Утверждения не являются допустимой формой обработки ошибок.Используйте их, чтобы помочь в выявлении программных ошибок во время тестирования.

Утверждение отражает состояние, которое никогда не должно возникать и не ожидалось, когда приложение не может продолжить выполнение по той или иной причине, тогда как исключение указывает на состояние, которое не считается "нормальным", но не было неожиданным и из которого можно было бы восстановить.

Например, если я выделю пространство в куче, и это выделение завершится неудачно, я не смогу продолжить работу, поэтому я утверждаю, что возвращенный адрес действителен; где оно недопустимо, утверждение не выполняется, и программа завершается с ним.

С другой стороны, если я открою файл для чтения, а он не существует, то можно будет исправить ситуацию, в этом случае выдается исключение (и перехватывается, и обрабатывается до тех пор, пока возможно).

Как правило, утверждения наиболее полезны на этапе отладки, тогда как исключения считаются частью обычной программы и обработки ошибок. Общее мнение состоит в том, что утверждения должны быть отключены в производственном коде (чтобы защитить пользователей от явных сбоев), тогда как я прочитал научную мысль, которая утверждает, что это контрпродуктивно, и что пользователь должен увидеть сбой утверждения, чтобы они может правильно сообщить о проблеме.

Лично я иногда комбинирую эти две техники; обычно, если я ловлю исключение, которое я не верю, может быть брошено. В приведенном выше примере, если я проверяю существование файла перед попыткой его открыть, то не ожидаю, что будет сгенерировано исключение, а если оно есть, то я склонен иметь дело с этим, поднимая утверждение в соответствующем блоке catch. Я считаю этот метод особенно полезным в Java, где такие исключения полностью проверяются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top