Шаг 51.
Библиотека STL.
Обработка ошибок и исключений. Члены классов исключений

    На этом шаге мы рассмотрим члены классов исключений.

    Обработка исключений в секциях catch обычно производится через интерфейс исключений. Интерфейс всех стандартных классов исключений состоит из единственной функции what(). Функция возвращает дополнительную информацию (помимо типа исключения) в виде строки, завершенной нулевым байтом:

namespace std {
  class exception { 
    public: 
      virtual const char* what() const throw();
      .    .    .    .    .
  };
}

    Содержимое строки определяется реализацией. В частности, это может быть строка с многобайтовой кодировкой, завершенная нулем, интерпретируемая как wstring. Строка, возвращаемая функцией what(), продолжает существовать вплоть до уничтожения объекта исключения, от которого она была получена.


    Примечание. Время жизни возвращаемого значения what() в исходном стандарте не оговорено. Для решения проблемы было внесено специальное предложение.

    Остальные члены стандартных классов исключений предназначены для создания, копирования, присваивания и уничтожения объектов исключений. Стандартные классы не имеют членов, содержащих дополнительную информацию об исключении (помимо функции what()). Например, не существует переносимых средств для получения информации о контексте исключения или неверного индекса при ошибке выхода из интервала. Переносимые возможности обработки дополнительной информации фактически ограничиваются выводом сообщения, полученного от what():

try {
 .    .    .    .
}
catch (const std::exception& error) {
  // Вывод сообщения об ошибке, определяемого реализацией 
  std::cerr << error.what() << std::endl;
   .    .    .    .
}

    Единственным источником информации об исключении, помимо функции what(), является конкретный тип исключения. Например, при обработке исключения bad_alloc программа может попытаться выделить дополнительную память.

    На следующем шаге мы рассмотрим генерирование стандартных исключений.




Предыдущий шаг Содержание Следующий шаг