Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

16.2.Синтаксис обработки исключительных ситуаций

Для обработки ИС в С++ используются такие основные понятия, как блоки try и catch и оператор throw, а также предопределенный класс exception и производные от него.

Блоки обработки ИС.

Чтобы перехватить ИС, поставьте перед блоком ключевое слово try и поместите после него одну или несколько секций catch, которые называются обработчиками ИС (exception handlers):

try

{

// Фрагмент кода, который может инициировать исключения (охраняемый)

}

catch (Exception_Type_1 t)

{

// Обработка ИС типа Exception_Type_1

}

catch (Exception_Type_2 t)

{

// Обработка ИС типа Exception_Type_2

}

// Другие блоки catch

catch (...)

{

// Обработка ИС всех остальных типов

}

// продолжение выполнения программы после обработки ИС

Каждый обработчик, за исключением обработчика с многоточием, соответствует одному конкретному типу ИС. Если во фрагменте, называемом try-блоком, инициируется исключение, компилятор просматривает список обработчиков в порядке их перечисления и ищет обработчик, подходящий по типу сгенерированной ИС. Многоточие соответствует исключениям любого типа; если такой обработчик присутствует (а он не является обязательным), он должен находиться последним в списке. Обработчик с многоточием может быть и единственным, в этом случае он в состоянии обработать ИС любого типа:

try

{

// Фрагмент кода, который может инициировать исключения (охраняемый)

}

catch (...)

{

// Обработка ИС всех типов

}

// продолжение выполнения программы после обработки ИС

Внутри обработчика вы можете предпринимать любые действия для выхода из ситуации. Сведения об ИС можно получить из аргумента catch — кроме обработчика с многоточием, который понятия не имеет, что он перехватил. Типы ИС будут рассмотрены позже.

Выполнение программы после возникновения ИС.

Если выполнение try-блока обходится без возникновения ИС, программа благополучно игнорирует все обработчики и продолжает работу с первого выражения за последним обработчиком. Если же исключение все же произошло, оно будет единственным из всего списка, и после его обработки выполнение программы продолжится за последним обработчиком списка.

Существуют два исключения из этих правил.

Первое. Обработчик может содержать вызов крамольного goto или инициировать еще одну ИС. Если обработчик инициирует ИС, то это может быть повторный вызов ИС того же типа или другого:

catch(int exception)

{

// Что-то делаем, а затем …

throw(“Помогите, спасите!”); // Инициируется исключение типа char*

}

Инициирование исключения из обработчика немедленно завершает выполнение той функции или блока, где оно инициировано.

Второе. Если исключение не перехвачено, т.е. для ИС не нашлось ни одного обработчика, по умолчанию вызывается глобальная функция unexpected(). Она, в свою очередь, просто прекращает выполнение программы путем вызова функции terminate(), abort() или exit(int). Вместе с тем с помощью функции set_unexpected(unexpected_handler ph) программист может установить свою функцию-обработчик необработанных ИС, которая должна иметь сигнатуру unexpected_handler. Заметьте, что Ваша функция завершения просто обязана завершить программу и не может инициировать другие ИС. Она может выполнить необходимые подготовительные действия, но никогда не должна возвращать управление вызывающей программе, так как из этого ничего путного не выйдет.

Вложенные блоки обработки ИС.

Да, вложение блоков try/catch разрешается, хотя пользоваться этой возможностью следует как можно реже, если только вы хотите сохранить дружеские отношения с персоналом сопровождения вашей программы.

try

{

// Ненадежный фрагмент fr_1

try

{

// Еще один ненадежный фрагмент fr_2

try

{

// И еще один… fr_3

}

catch(...)

{

// обрабочик ИС, возникшей во фрагменте fr_3

}

}

catch(...)

{

// обрабочик ИС, возникшей во фрагменте fr_2

}

}

catch(...)

{

// обрабочик ИС, возникшей во фрагменте fr_1

}

Создавать подобную мешанину без крайней надобности разделения обработчиков по разным областям не стоит.

Внешние ИС не перехватываются!

Вы можете перехватить любое исключение, инициированное посредством throw. Тем не менее, существуют и другие исключения, которые не удается перехватить переносимыми способами. Например, если пользователь применяет для завершения программы некоторую комбинацию клавиш, нет гарантии, что операционная система сгенерирует исключение, которое может быть перехвачено вашими обработчиками. Вообще говоря, обработка исключений относится только к исключениям, сгенерированным программой: все остальное непереносимо. Не перехватывается, например, разыменование нулевого или недействительного указателя.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]