Бьерн Страуструп.
Язык программирования С++
38
эта ошибка вообще не возникла бы). Выход такой: создатель класса обнаруживает ошибку выхода за
границу массива, но только сообщает о ней неизвестному пользователю. Пользователь сам принимает
необходимые меры.
Например:
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.
Достарыңызбен бөлісу: