Почему лучше исключать исключение, а не возвращать код ошибки?
Обработка устаревшей ошибки имеет тенденцию следовать методу, в котором все функции возвращают код в зависимости от успеха/сбоя. Вы должны проверить этот код и обработать (если ошибка) соответственно.
Современные языки программирования, однако, следуют за моделью исключения, где, если что-то исключительное случается, что невозможно обработать, исключение получает бросок - который продолжает всплывать до его обработки.
Мой вопрос почему мы перешли к модели исключений? В чем причины этого? Почему это лучше?
Пояснения/ссылки будут высоко оценены.
Ответы
Ответ 1
Я писал об этом подробно: Исключения против статуса возвращает, но кратко:
- Исключения оставляют ваш код чистым от всех проверок, необходимых при проверке статуса при каждом вызове,
- Исключения позволяют использовать возвращаемое значение функций для действительных значений,
- Исключения могут содержать больше информации, чем возврат статуса,
- Самое главное: исключения не могут быть проигнорированы посредством бездействия, в то время как возврат статуса может.
Чтобы развернуть последнюю точку: если вы забудете делать то, что вы должны делать со статусом, вы игнорируете ошибки. Если вы забудете делать то, что вы должны делать с исключениями, исключение превращается в внешний слой программного обеспечения, где оно становится видимым.
Ответ 2
Вот несколько причин
- Игнорирование исключения требует действия разработчика, в то время как игнорирование плохого возвращаемого значения требует ровно 0 действий. Теоретически это делает вероятность того, что разработчик будет обрабатывать ошибку или игнорировать ее или даже не осознавать, что это происходит.
- Обеспечивает более чистое разделение между точкой ошибки и обработкой. Это не приводит к механическому распространению ошибки в каждой точке между ними.
- Исключения могут иметь большую и более богатую информационную нагрузку, чем простой код ошибки. Есть способы сделать это с помощью кодов ошибок, но это скорее запоздалая мысль и немного громоздка.
Ответ 3
Коды состояния обычно лучше, чем исключения, в случаях, когда они представляют случаи, когда обрабатывается функция код быстрого вызова. Проблема с кодами состояния заключается в том, что если код немедленного вызова не обрабатывает их, это, вероятно, ничего не сделает. Если код генерирует исключение, а код немедленного вызова не готов к его обработке, исключение будет распространяться на код, который, по крайней мере, утверждает, что он подготовлен.