Язык программирования C++. Вводный курс


Иерархия классов исключений в стандартной библиотеке C++ - часть 3


/p>

}

Функция может возбудить исключение range_error, чтобы сообщить об ошибке во внутренних вычислениях. Исключение overflow_error

говорит об ошибке арифметического переполнения, а underflow_error – о потере значимости.

Класс exception

является базовым и для класса исключения bad_alloc, которое возбуждает оператор new(), когда ему не удается выделить запрошенный объем памяти (см. раздел 8.4), и для класса исключения bad_cast, возбуждаемого в ситуации, когда ссылочный вариант оператора dynamic_cast не может быть выполнен (см. раздел 19.1).

Переопределим оператор operator[] в шаблоне Array из раздела 16.12 так, чтобы он возбуждал исключение типа range_error, если индекс массива Array

выходит за границы:

#include <stdexcept>

#include <string>

 

template <class elemType>

class Array {

public:

   // ...

   elemType& operator[]( int ix ) const

   {

      if ( ix < 0 || ix >= _size )

      {

         string eObj =

         "ошибка: вне диапазона в Array<elemType>::operator[]()";

 

         throw out_of_range( eObj );

      }

      return _ia[ix];

   }

 

   // ...

private:

   int _size;

   elemType *_ia;

};

Для использования предопределенных классов исключений в программу необходимо включить заголовочный файл <stdexcept>. Описание возбужденного исключения содержится в объекте eObj

типа string. Эту информацию можно извлечь в обработчике с помощью функции-члена what():

int main()

{

   try {

      // функция main() такая же, как в разделе 16.2

   }

   catch ( const out_of_range &excep ) {

      // печатается:

      // ошибка: вне диапазона в Array<elemType>::operator[]()

      cerr << excep.what() << "\n";

      return -1;

   }

}

В данной реализации выход индекса за пределы массива в функции try_array() приводит к тому, что оператор взятия индекса operator[]()

класса Array

возбуждает исключение типа out_of_range, которое перехватывается в main().




Начало  Назад  Вперед