69. Определите разумную стратегию обработки ошибок и строго ей следуйте

69. Определите разумную стратегию обработки ошибок и строго ей следуйте

Резюме

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

• Идентификация: какие условия являются ошибкой.

• Строгость: насколько важна каждая ошибка.

• Обнаружение: какой код отвечает за обнаружение ошибки.

• Распространение: какой механизм используется для описания и распространения уведомления об ошибке в каждом модуле.

• Обработка: какой код отвечает за выполнение действий, связанных с ошибкой.

• Уведомление: каким образом информация об ошибке вносится в журнальный файл или производится уведомление пользователя программы.

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

Обсуждение

В этой рекомендации мы рассматриваем ошибки времени выполнения, возникновение которых не связано с неверным кодированием (таким ошибкам посвящена рекомендация 68).

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

Везде.

• Определение ошибок. Для каждой сущности (например, для каждой функции, класса, модуля) документируйте внутренние и внешние инварианты.

Для каждой функции.

• Определение ошибок. Для каждой функции документируйте ее пред- и постусловия, инварианты, за которые она отвечает, и гарантии безопасности, которые она поддерживает (см. рекомендации 70 и 71). Заметим, что деструкторы и функции освобождения ресурсов должны всегда поддерживать гарантию бессбойности, поскольку в противном случае часто невозможно надежно и безопасно выполнить освобождение захваченных ресурсов (см. рекомендацию 51).

Для каждой ошибки (см. определение "ошибки" в рекомендации 70).

• Серьезность ошибки и категоризация. Для каждой ошибки определите уровень серьезности. Желательно предоставить способ тонкой настройки диагностики для определенных категорий и уровней ошибок.

• Обнаружение ошибок. Для каждой ошибки документируйте, какой именно код отвечает за ее обнаружение, следуя советам рекомендации 70.

• Обработка ошибок. Для каждой ошибки определите код, который отвечает за ее обработку, следуя советам рекомендации 74.

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

Для каждого модуля.

• Передача ошибки. Для каждого модуля (обратите внимание: для каждого модуля, а не для каждой ошибки) определите механизм, который будет использоваться для передачи информации об ошибке (например, исключения С++, исключения COM, исключения CORBA, коды возврата).

Мы уже подчеркивали, что стратегия обработки ошибок может изменяться только на границах модулей (см. рекомендации 62 и 63). Каждый модуль должен последовательно использовать единую стратегию обработки ошибок внутри модуля (например, модули, написанные на С++, должны использовать исключения; см. рекомендацию 72), и последовательно пользоваться единой, хотя, возможно, иной стратегией обработки ошибок для своего интерфейса (например, модуль может предоставлять обычный API на языке С, чтобы обеспечить возможность его использования кодом, написанном на разных языках программирования; или использовать оболочку COM и, соответственно, исключения COM).

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

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

Ссылки

[Abrahams01b] • [Allison98] §13 • [McConnell93] §5.6 • [Stroustrup94] §16.2, §E.2 • [Stroustrup00] §14.9, §19.3.1 • [Sutter04b]

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Проблемы создания объектных образов и строго типизованные коллекции

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Проблемы создания объектных образов и строго типизованные коллекции Строго типизованные коллекции можно найти в библиотеках базовых классов .NET и это очень полезные программные конструкции. Однако эти пользовательские контейнеры мало помотают в решении проблем


Строго типизованные объекты DataSet

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

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


Совет 20. Определите тип сравнения для ассоциативного контейнера, содержащего указатели

Из книги 10 простых и легких способов моментального повышения прибыльности любого коммерческого сайта автора Дин Терри

Совет 20. Определите тип сравнения для ассоциативного контейнера, содержащего указатели Предположим, у нас имеется контейнер set, содержащий указатели string*, и мы пытаемся включить в него несколько новых элементов:set<string*> ssp; // ssp = "set of string ptrs"ssp.insert(new string("Anteater"));ssp.insert(new


Следуйте за курсором

Из книги Справочник по PHP автора

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


Функции обработки ошибок

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Функции обработки ошибок error_logПосылка сообщения об ошибке.Синтаксис:int error_log(string message, int message_type [, string destination [, string extra_headers]])Сообщение, посылаемое этой функцией, может быть направлено в журнал системных сообщений web-сервера, прот TCP или в файл.В первом аргументе message


Директива обработки ошибок

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

Директива обработки ошибок В СП ТС реализована директива #error. Ее формат:#error <текст>Обычно эту директиву записывают среди директив условной компиляции для обнаружения некоторой недопустимой ситуации. По директиве #error препроцессор прерывает компиляцию и выдает


16.3.10. Директивы обработки ошибок

Из книги Социальные сети [Источники новых клиентов для бизнеса] автора Парабеллум Андрей Алексеевич

16.3.10. Директивы обработки ошибок Такая директива всего одна, но она очень полезна. Например, произошла ошибка 404 (файл не найден). Вы можете сопоставить этой ошибке URL, на который будет перенаправлен браузер пользователя. Обычно перенаправление устанавливают на документ,


Определить стратегию

Из книги Как раскрутить и разрекламировать Web-сайт в сети Интернет автора Загуменов Александр Петрович

Определить стратегию Социальные сети – это часть Social Media Marketing (SMM). Если вы хотите продвигаться в социальных сетях и в интернет-маркетинге, обращаясь к какому-то агентству или самостоятельно, важно понять одну вещь. Социальные сети – это только часть маркетинга.Сначала мы


Улучшение посещаемости сайта за счет обработки ошибок

Из книги Монетизация сайта. Секреты больших денег в Интернете автора Меркулов Андрей

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


Определите стратегию продаж на сайте

Из книги HTML5 для веб-дизайнеров автора Джереми Кит

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


Определите целевые действия, которые должен совершить посетитель на сайте

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

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


Глава 4. Разработайте стратегию продвижения в Интернете

Из книги автора

Глава 4. Разработайте стратегию продвижения в Интернете Многие думают, что достаточно заплатить деньги за разработку сайта, арендовать площадку для его размещения, и все – клиенты повалят толпой.При этом принято считать, что чем больше заплачено за создание сайта, тем


Выберите собственную стратегию

Из книги автора

Выберите собственную стратегию Только вы решаете, как будете использовать HTML5 – осторожно или, наоборот, амбициозно.По крайней мере что вы можете сделать без всяких проблем – это взять ваши текущие HTML– или XHTML-документы и изменить доктайп на:<!DOCTYPE html>Ну вот, вы только


Г.3. Стандартные функции обработки ошибок

Из книги автора

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