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

Представьте, что вам поручили составить алгоритм автоматизации систем управления самолетом. Вы заключили сделку с известной авиастроительной компанией. Ваш софт сейчас используется в 30% всех современных систем управления самолетами. Это слишком сложная система, с которой вы работали годами, но забыли указать в своей программе, что ни при каких обстоятельствах самолет не должен входить в пикирование.

Однажды ночью вас вызвали в компанию по срочному делу. Есть отчет о неожиданных падениях, вызванных вашим программным обеспечением. Вы собрали свою команду, чтобы выяснить ошибку, вызывающую сбои системы. Это общеизвестно трудный процесс для чрезмерно сложной системы. После нескольких недель расследования кто-то из вашей команды обнаружил, что в вашем программном обеспечении отсутствует обработка исключений.

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

Обсуждение

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

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

Как разработчики, мы спрашиваем себя: при каких условиях наша программа должна генерировать исключение? Это непростая задача. Прежде всего, можете ли вы перечислить все случаи неопределенного поведения вашей программы? В этих случаях мы используем общую картину. Мы переводим предыдущий вопрос как какова основная роль моих функций? Для чего они предназначены? Хорошая философия дизайна должна понимать четкие намерения, поскольку наши продукты должны быть просты в использовании и трудны, если не невозможны, для неправильного использования.

Имея это в виду, мы можем указать, как мы должны думать о написании нашего кода.

Вернемся к нашей истории. Предположим, для простоты, что наша система содержит следующий код:

Предположим, что приведенный выше код имеет административный контроль над частями самолета. Это приводит нас к исследованию функции obj.automate(). Покопавшись в нашем коде немного дальше, мы обнаружили это:

Можете ли вы определить, что пошло не так с этой функцией?

Мы не можем гарантировать, что наша система непровалится.

Давайте улучшим эту функцию, введя блок try-catch, в котором мы можем гарантировать, что система завершит работу, как только она достигнет критического состояния, в котором obj.optimize() приводит к решению о пикировании.

Этот блок кода спасает жизни!

Теперь мы можем гарантировать, что при выполнении critical_conditions управление будет передано пилоту.

Выводы

Исключительный код должен иметь:

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

Примечания:

  • Языки программирования предоставляют эту функцию, поэтому в зависимости от вашего языка вам следует ознакомиться с технической документацией о том, как реализовать обработку исключений.
  • Код C++ используется для иллюстративных примеров, так как большинство современных систем управления реализованы на C++, и лично мне этот язык очень нравится!

Первоначально опубликовано на https://dcode.hashnode.dev.