Бьерн Страуструп - Язык программирования С++. Вступление, глава 1 Страница 33. Обработка особых ситуаций
|
Страница 33 из 41 1.4.4 Обработка особых ситуаций По мере роста программ, а особенно при активном использовании библиотек появляется необходимость стандартной обработки ошибок (или, в более широком смысле, "особых ситуаций"). Языки Ада, Алгол-68 и Clu поддерживают стандартный способ обработки особых ситуаций.
Снова вернемся к классу vector. Что нужно делать, когда операции индексации передано значение индекса, выходящее за границы массива? Создатель класса vector не знает, на что рассчитывает пользователь в таком случае, а пользователь не может обнаружить подобную ошибку (если бы мог, то эта ошибка вообще не возникла бы). Выход такой: создатель класса обнаруживает ошибку выхода за границу массива, но только сообщает о ней неизвестному пользователю. Пользователь сам принимает необходимые меры. Например:
class vector { // определение типа возможных особых ситуаций class range { }; // ... };
Вместо вызова функции ошибки в функции vector::operator[]() можно перейти на ту часть программы, в которой обрабатываются особые ситуации. Это называется "запустить особую ситуацию" ("throw the exception"):
int & vector::operator [] ( int i ) { if ( i < 0 || sz <= i ) throw range (); return v [ i ]; }
В результате из стека будет выбираться информация, помещаемая туда при вызовах функций, до тех пор, пока не будет обнаружен обработчик особой ситуации с типом range для класса вектор (vector::range); он и будет выполняться.
Обработчик особых ситуаций можно определить только для специального блока:
void f ( int i ) { try { // в этом блоке обрабатываются особые ситуации // с помощью определенного ниже обработчика vector v ( i ); // ... v [ i + 1 ] = 7; // приводит к особой ситуации range // ... g (); // может привести к особой ситуации range // на некоторых векторах } catch ( vector::range ) { error ( "f (): vector range error" ); return; } }
Использование особых ситуаций делает обработку ошибок более упорядоченной и понятной. Обсуждение и подробности отложим до главы 9. |