На этом шаге мы рассмотрим члены классов исключений.
Обработка исключений в секциях catch обычно производится через интерфейс исключений. Интерфейс всех стандартных классов исключений состоит из единственной функции what(). Функция возвращает дополнительную информацию (помимо типа исключения) в виде строки, завершенной нулевым байтом:
namespace std { class exception { public: virtual const char* what() const throw(); . . . . . }; }
Содержимое строки определяется реализацией. В частности, это может быть строка с многобайтовой кодировкой, завершенная нулем, интерпретируемая как wstring. Строка, возвращаемая функцией what(), продолжает существовать вплоть до уничтожения объекта исключения, от которого она была получена.
Остальные члены стандартных классов исключений предназначены для создания, копирования, присваивания и уничтожения объектов исключений. Стандартные классы не имеют членов, содержащих дополнительную информацию об исключении (помимо функции what()). Например, не существует переносимых средств для получения информации о контексте исключения или неверного индекса при ошибке выхода из интервала. Переносимые возможности обработки дополнительной информации фактически ограничиваются выводом сообщения, полученного от what():
try { . . . . } catch (const std::exception& error) { // Вывод сообщения об ошибке, определяемого реализацией std::cerr << error.what() << std::endl; . . . . }
Единственным источником информации об исключении, помимо функции what(), является конкретный тип исключения. Например, при обработке исключения bad_alloc программа может попытаться выделить дополнительную память.
На следующем шаге мы рассмотрим генерирование стандартных исключений.