Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / LECS18.DOC
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
92.67 Кб
Скачать

Исключения

Эта глава описывает обработку исключений (exсeptions) С++. Исключениями называют нештатные (ошибочные) ситуации. Обычно такие ситуации прерывают пользовательскую программу с сообщением об ошибке, которое выдает система. Примером является деление на ноль. Как правило, в подобных случаях выполнение программы аварийно завершается системой. С++ позволяет программисту попытаться восстановить работоспособность программы при возникновении исключительных ситуаций и продолжить ее выполнение.

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

Использование assert.H

Корректность программы частично может рассматриваться как гарантия того, что вычисление завершиться корректным выводом, зависящим от корректного ввода. Пользователь вычислений несет ответственность за корректность ввода. Это предусловие (precondition). Вычисление, если оно удачно, удовлетворяет постусловию (postcondition). Обеспечение полной проверки по всем правилам было бы идеально, но обычно она не выполняется. Но мы, по крайней мере, можем отслеживать проверку утверждения в процессе выполнения программы, что обеспечивает весьма полезную диагностику. В самом деле, дисциплина, заставляющая продумывать надлежащие утверждения, часто помогает программисту избежать ошибок и ловушек.

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

void assert (bool выражение);

Если результат выражения – ложь, то выполнение прерывается с выводом диагностического сообщения. проверка утверждений не выполняется, если определено макро NDEBUG.

Рассмотрим размещение безопасного массива типа vect (см.раздел 6.5, «Класс vect», на стр 166).

vect ::vect(int n) : size (n)

{

assert (n > 0);

p = new int [size];

assert (p ! = 0);

}

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

Можно сделать эту схему слегка более изощренной, предоставив различные уровни проверки, как это сделано в файле checks.h из Borland C++. В этом пакете можно устанавливать флаг_DEBUG:

DEBUG 0 без проверки

DEBUG 1 проверять только предусловие (PRECONDITION)

DEBUG 2 ПОЛНАЯ ПРОВЕРКА (CHECK)

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

Соседние файлы в папке Лекции