ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4265
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
406
Для использования в программе функций из библиотеки специ-
ального назначения нужно при помощи директивы
#include
включить в эту программу соответствующий файл с прототипами
функций.
В данной книге рассматриваются не все компоненты из стан-
дартной библиотеки языка программирования C++. Это сделано
по двум причинам.
Во-первых, стандартная библиотека довольно громоздкая и под-
робное рассмотрение всех компонентов значительно увеличило
бы объем книги.
Во-вторых, книга предназначена для начинающих и поэтому ма-
ловероятно, что подробное изложение стандартной библиотеки
необходимо для таких читателей. Даже, наоборот — громозд-
кость может отбить охоту к изучению.
Поэтому при изложении принят компромиссный подход. Стан-
дартная библиотека языка программирования C рассмотрена до-
вольно подробно. Это позволяет ознакомиться со стандартными
функциями, предназначенными для решения рутинных задач
программирования. Из стандартной библиотеки языка програм-
мирования C++ дополнительно рассмотрены стандартные средст-
ва, наиболее часто используемые в программировании, а именно:
обработка исключений, динамическая идентификация типов, об-
работка строк и потоки ввода/вывода. Однако следует заметить,
что при должном изучении этой части стандартной библиотеки
даже самостоятельное изучение остальных компонентов стан-
дартной библиотеки языка программирования C++ не должно
вызвать затруднений.
Г Л А В А
36
Обработка исключений
<exception>
36.1. Классы и функции
В заголовочном файле exception объявляются следующие классы
и функции, используемые при обработке исключений:
namespace std
{
class exception;
class bad exception;
typedef void (*unexpected_handler)();
unexpected_handler set_unexpected(unexpected_handler f)
throw();
void unexpected();
typedef void (*terminate_handler)();
terminate_handler set_terminate(terminate_handler f)
throw();
void terminate();
bool uncaught_exception();
}
Подробно назначение этих классов и функций рассмотрено в сле-
дующих разделах этой главы.
Часть IV. Стандартная библиотека языка программирования С++
408
36.2. Класс
exception
Класс
exception
является базовым классом для всех стандартных
исключений, определенных в стандартной библиотеке языка про-
граммирования С++. Этот класс имеет следующий интерфейс:
namespace std
{
class exception
{
public:
exception() throw();
exception(const exception& rhs) throw();
exception& operator=(const exception& rhs) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
Строка языка программирования C, адрес которой возвращает
метод
what
, не определена. Эта строка может быть определена
конструкторами классов, наследуемых от класса
exception
.
Ни один из методов класса
exception
не выбрасывает исключе-
ния.
36.3. Класс
bad_exception
Класс
bad_exception
определяет тип объектов, которые может
выбросить обработчик не специфицированных исключений. Этот
класс наследуется от класса
exception
и имеет следующий ин-
терфейс:
namespace std
{
class bad_exception : public exception
{
public:
bad_exception() throw();
bad_exception(const bad_exception&) throw();
bad_exception& operator=(const bad_exception&) throw();
Глава 36. Обработка исключений <exception>
409
virtual ~bad_exception() throw();
virtual const char* what() const throw();
};
}
Строка, адрес которой возвращает метод
what
, зависит от реали-
зации.
36.4. Аварийное завершение
программы
Для аварийного завершения программы предназначена функция
terminate
, которая имеет следующий прототип:
void terminate();
Функция
terminate
вызывает функцию, которая называется
обра-
ботчиком аварийного завершения
программы (terminate handler)
и имеет следующий прототип:
typedef void (*terminate_handler)();
Обработчик аварийного завершения программы устанавливается
функцией
set_terminate
, которая имеет следующий прототип:
terminate_ handler set_terminate(terminate_handler ph)
throw();
Эта функция устанавливает новый обработчик аварийного за-
вершения программы, на который указывает параметр
ph
, и воз-
вращает адрес предыдущего обработчика аварийного завершения
программы.
Обработчик аварийного завершения, установленный по умолча-
нию при запуске программы, вызывает функцию
abort
, которая
была описана в
разд. 21.4
.
В листинге 36.1 приведен пример установки и вызова нового об-
работчика аварийного завершения программы. Как правило, об-
работчик аварийного завершения программы используется для
корректного освобождения ресурсов, захваченных этой програм-
мой.
Часть IV. Стандартная библиотека языка программирования С++
410
Листинг 36.1. Установка и вызов обработчика аварийного
завершения программы
#include <iostream>
#include <exception>
using namespace std;
int* p;
void foo()
{
cout<< "val: " << *p << endl;
delete p;
}
int main()
{
set_terminate(foo);
p = new int(10);
terminate(); // val: 10
return 0;
}
36.5. Обработка
не специфицированного исключения
Если функция выбрасывает не специфицированное в ней исклю-
чение, то среда исполнения программы вызывает функцию
unex-
pected
, которая имеет следующий прототип:
void unexpected();
Функция
terminate
в свою очередь вызывает функцию, которая
называется
обработчиком не специфицированного исключения
(unexpected handler) и имеет следующий прототип:
typedef void (*unexpected_handler)();
Обработчик не специфицированного исключения устанавливает-
ся функцией
set_unexpected
, которая имеет следующий прото-
тип:
unexpected_handler set_unexpected(unexpected_handler ph)
throw();