Язык программирования C++ для профессионалов



           

Обработка ошибок


Я прервал вас, поэтому не прерывайте меня.

Уинстон Черчилл

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

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

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

Рассмотрим в качестве примера как для класса Vector можно представлять и обрабатывать особые ситуации, вызванные выходом за границу массива:

class Vector { int* p; int sz; public: class Range { }; // класс для особой ситуации

int& operator[](int i);

// ... };

Предполагается, что объекты класса Range будут использоваться как особые ситуации, и запускать их можно так:

int& Vector::operator[](int i) { if (0<=i && i<sz) return p[i]; throw Range(); }

Если в функции предусмотрена реакция на ошибку недопустимого значения индекса, то ту часть функции, в которой эти ошибки будут перехватываться, надо поместить в оператор try. В нем должен быть и обработчик особой ситуации:

void f(Vector& v) { // ...

try { do_something(v); // содержательная часть, работающая с v } catch (Vector::Range) { // обработчик особой ситуации Vector::Range

// если do_something() завершится неудачно, // нужно как-то среагировать на это

// сюда мы попадем только в том случае, когда // вызов do_something() приведет к вызову Vector::operator[]() // из-за недопустимого значения индекса




Содержание  Назад  Вперед