• В заголовке new
определен класс исключения bad_alloc
, рассматриваемый в разделе 12.1.2.
• В заголовке type_info
определен класс исключения bad_cast
, рассматриваемый в разделе 19.2.
В классах exception
, bad_alloc
и bad_cast
определен только стандартный конструктор (см. раздел 2.2.1), поэтому невозможно инициализировать объект этих типов.
Поведение исключений других типов прямо противоположно: их можно инициализировать объектом класса string
или строкой в стиле С, однако значением по умолчанию их инициализировать нельзя. При создании объекта исключения любого из этих типов необходимо предоставить инициализатор. Этот инициализатор используется для предоставления дополнительной информации о произошедшей ошибке.
Таблица 5.1. Стандартные классы исключений, определенные в заголовке stdexcept
exception | Наиболее общий вид проблемы |
runtime_error | Проблема, которая может быть обнаружена только во время выполнения |
range_error | Ошибка времени выполнения: полученный результат превосходит допустимый диапазон значения |
overflow_error | Ошибка времени выполнения: переполнение регистра при вычислении |
underflow_error | Ошибка времени выполнения: недополнение регистра при вычислении |
logic_error | Ошибка в логике программы |
domain_error | Логическая ошибка: аргумент, для которого не существует результата |
invalid_argument | Логическая ошибка: неподходящий аргумент |
length_error | Логическая ошибка: попытка создать объект большего размера, чем максимально допустимый для данного типа |
out_of_range | Логическая ошибка: используемое значение вне допустимого диапазона |
В классах исключений определена только одна функция what()
. Она не получает никаких аргументов и возвращает константный указатель на тип char
. Это указатель на символьную строку в стиле С (см. раздел 3.5.4), содержащую текст описания переданного исключения.
Содержимое символьного массива (строки в стиле С), указатель на который возвращает функция what()
, зависит от типа объекта исключения. Для типов, которым при инициализации передают строку класса string
, функция what()
возвращает строку. Что же касается других типов, то возвращаемое значение зависит от компилятора.
Упражнение 5.23. Напишите программу, которая читает два целых числа со стандартного устройства ввода и выводит результат деления первого числа на второе.
Упражнение 5.24. Перепишите предыдущую программу так, чтобы она передавала исключение, если второе число — нуль. Проверьте свою программу с нулевым вводом, чтобы увидеть происходящее при отсутствии обработчика исключения.
Упражнение 5.25. Перепишите предыдущую программу так, чтобы использовать для обработки исключения блок try
. Раздел catch
должен отобразить сообщение и попросить пользователя ввести новое число и повторить код в блоке try
.
Язык С++ предоставляет довольно ограниченное количество операторов. Некоторые из них предназначены для управления потоком выполнения программы.
• Операторы while
, for
и do while
позволяют реализовать итерационные циклы.
• Операторы if
и switch
позволяют реализовать условное выполнение.
• Оператор continue
останавливает текущую итерацию цикла.
• Оператор break
осуществляет принудительный выход из цикла или оператора switch
.
• Оператор goto
передает управление помеченному оператору.
• Операторы try
и catch
позволяют создать блок try
, в который заключают операторы программы, потенциально способные передать исключение. Оператор catch
начинает раздел обработчика исключения, код которого предназначен для реакции на исключение определенного типа.
• Оператор throw
позволяет передать исключение, обрабатываемое в соответствующем разделе catch
.
• Оператор return
останавливает выполнение функции. (Подробней об этом — в главе 6.)
Кроме того, существуют операторы выражения и операторы объявления. Объявления и определения переменных были описаны в главе 2.