Ключевое слово try служит для обозначения контролируемого блока — кода, в котором может генерироваться исключение. Блок заключается в фигурные скобки:
try{
...
}
Все функции, прямо или косвенно вызываемые из try-блока, также считаются ему принадлежащими.
Генерация (порождение) исключения происходит по ключевому слову throw, которое
употребляется либо с параметром, либо без него:
throw [ выражение ];
Тип выражения, стоящего после throw, определяет тип порождаемого исключения.
При генерации исключения выполнение текущего блока прекращается, и происходит поиск соответствующего обработчика и передача ему управления. Как правило, исключение генерируется не непосредственно в try-блоке, а в функциях, прямо или косвенно в него вложенных.
Не всегда исключение, возникшее во внутреннем блоке, может быть сразу правильно
обработано. В этом случае используются вложенные контролируемые блоки, и исключение передается на более высокий уровень с помощью ключевого слова throw без параметров.
|
|
Обработчики исключений начинаются с ключевого слова catch, за которым в скобках следует тип обрабатываемого исключения. Они должны располагаться непосредственно за try-блоком. Можно записать один или несколько обработчиков в соответствии с типами обрабатываемых исключений. Синтаксис обработчиков напоминает определение функции с одним параметром — типом исключения. Существует три формы записи:
catch(тип имя){... /* тело обработчика */ }
catch(тип){... /* тело обработчика */ }
catch(...){.. /* тело обработчика */ }
Первая форма применяется, когда имя параметра используется в теле обработчика для выполнения каких-либо действий — например, вывода информации об исключении.
Вторая форма не предполагает использования информации об исключении, играет роль только его тип. Многоточие вместо параметра обозначает, что обработчик перехватывает все исключения. Так как обработчики просматриваются в том порядке, в котором они записаны, обработчик третьего типа следует помещать после всех остальных. Пример:
сatch(int i){
Обработка исключений типа int
}
catch(const char *){
... // Обработка исключений типа const char*
}
catch(Overflow){
Обработка исключений класса Overflow
}
catch(...){
Обработка всех необслуженных исключений
}
После обработки исключения управление передается первому оператору, находящемуся
непосредственно за обработчиками исключений. Туда же, минуя код всех обработчиков, передается управление, если исключение в try-блоке не было сгенерировано.