66
Синтаксис перехвата исключений
Чтобы перехватить
исключение, поставьте перед блоком ключевое слово
try
и поместите после него
одну или несколько секций
catch
, которые называются обработчиками (handlers).
try {
//
Фрагмент, который может инициировать исключения
}
catch (Exception_Type t) {
//
Восстановление после исключения типа Exception_Type
}
catch (...) {
//
Восстановление после исключений всех остальных типов
}
Каждый обработчик, за исключением (опять нечаянный каламбур) обработчика с многоточием,
соответствует одному конкретному типу ошибок. Если из фрагмента, называемого
try
-блоком,
инициируется исключение, компилятор просматривает список обработчиков в порядке их
перечисления и ищет обработчик, подходящий по типу запущенного исключения. Многоточие
соответствует исключениям любого типа; если такой обработчик присутствует, он должен находиться
последним в списке.
Внутри обработчика вы можете предпринимать любые действия для выхода из ситуации. Сведения об
исключении можно получить из аргумента
catch
— кроме обработчика с многоточием,
который
понятия не имеет, что он должен перехватывать.
Выполнение программы после исключения
Если выполнение
try
-блока обходится без исключений, программа благополучно игнорирует все
обработчики и продолжает работу с первого выражения за последним обработчиком. Если же
исключение все же произошло, оно будет
единственным из всего списка, и после его обработки
выполнение программы продолжится за последним обработчиком списка. Существуют два исключения
(последний нечаянный каламбур): обработчик может содержать вызов крамольного
goto
или
запустить исключение. Если обработчик инициирует исключение, он может продолжить
распространение того же исключения или создать новое.
catch(int exception) {
//
Сделать что-то, а затем
throw(“Help!”);
//
Инициируется исключение типа char*
}
Инициирование исключения из обработчика немедленно завершает выполнение вмещающей функции
или блока.
Если исключение не перехвачено
Если для исключения не найдется ни одного обработчика, по умолчанию
вызывается глобальная
функция
terminate()
. Как вы думаете, что она делает? По умолчанию
terminate()
в конечном
счете вызывает библиотечную функцию
abort()
, и дело кончается аварийным завершением всей
программы. Вы можете вмешаться и установить собственную функцию
завершения с помощью
библиотечной функции
set_terminate()
. Соответствующий фрагмент файла except.h выглядит так:
typedef void (*terminate_function)();
termination_function set_terminate(terminate_function t_func);
В строке
typedef...
объявляется интерфейс к вашей функции завершения. Функция
set_terminate()
устанавливает функцию завершения, которую вместо функции
abort()
вызывает
функция
terminate()
. Функция
set_terminate()
возвращает текущую функцию завершения,
которую позднее можно восстановить повторным вызовом
set_terminate()
.