Определение исключений
Для того чтобы работать с исключениями, необходимо:
• Выделить контролируемый блок — блок try (контролировать, пытаться).
• Предусмотреть генерацию одного или нескольких исключений операторами throw (бросать, генерировать, посылать) внутри блока try или внутри функций, вызываемых из этого блока.
• Разместить сразу за блоком try один или несколько обработчиков исключений catch (ловить,перехватить).
Контролируемый блок — это составной оператор, перед которым записано ключевое слово try:
try {
// фрагмент кода
}
Оператор throw, предназначенный для генерации исключения, имеет вид: throw выражение.
Тип выражения, стоящего после throw, определяет тип порождаемого исключения. При генерации исключения выполнение текущего блока прекращается, и происходит поиск соответствующего обработчика и передача ему управления.
Синтаксис обработчиков напоминает определение функции с одним параметром и именем catch:
catch (/*... */)
{
// действия по обработке исключения
}
Объявление параметра обработчика возможно в одной из трех форм:
|
|
catch (Туре) { / / обработка исключения типа Туре }
catch (Туре info) {
/ / обработка исключения типа Туре
/ / с использованием значения info
}
catch (...) { // обработка исключений всех типов }
После обработки исключения управление передается первому оператору, находящемуся непосредственно за обработчиками исключений.
Туда же, минуя код всех обработчиков, передается управление, если исключение в try -блоке не было сгенерировано.
Если обработчик не в состоянии полностью обработать ошибку, он может сгенерировать исключение повторно с помощью оператора throw без параметров. В этом случае предполагается наличие внешних объемлющих блоков, в которых может находиться другой обработчик для этого типа исключения.
Общая схема посылки и обработки исключений выглядит так:
try {
операторы
throw выражение_1
операторы
throw выражение_2
операторы
}
catch ( спецификация_исключения_1 )
{ операторы_обработки_исключения_1 }
catch ( спецификация_исключения_2 )
{ операторы_обработки_исключения_2 }
Еще раз. Служебное слово try позволяет выделить в любом месте программы блок контроля за исключениями. Это блок программы, который надо пытаться выполнить.
Среди операторов, заключенных в фигурные скобки кроме обычных операторов, описаний и определений объектов программы, помещают специальные операторы, посылающие или генерирующие исключения. Формат оператора: throw выражение.
Когда с помощью выражения в операторе throw генерируется (формируется) специальный объект, называемый исключением, функции исполнительной библиотеки C++ выполняют следующие действия:
|
|
• создают копию параметра throw в виде временного статического объекта, тип и значение которого определяются формирующим его выражением; объект сохраняется до тех пор, пока исключение не будет обработано;
• в поисках подходящего обработчика раскручивают стек;
• передают объект исключения и управление программой непосредственно за блок контроля (за закрывающую фигурную скобку) обработчику, имеющему параметр, совместимый по типу с этим объектом;
· за блоком контроля обязательно размещается ловушка (или обработчик) исключений; исключения могут посылаться из разных мест блока контроля, они могут быть одного или разных типов; если за блоком контроля размещены несколько ловушек, то они должны отличаться типами принимаемых исключений;
· обработчик похож на функцию с одним параметром, не возвращающую значения:
catch ( спецификация_исключения )
{ операторы_обработки_исключения },
спецификация может иметь одну из трех форм:
тип_исключения имя
тип_исключения
многоточие
· посланное из блока контроля исключение ловится соответствующим ему обработчиком и после выполнения его операторов управление передается за последний обработчик;