КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис исключений. Перехват исключенийКлючевое слово try служит для обозначения контролируемого блока — кода, в котором может генерироваться исключение. Блок заключается в фигурные скобки:
try{ … }
Генерация (порождение) исключенияпроисходит по ключевому слову throw, которое употребляется либо с параметром, либо без него: throw [ выражение ]; Тип выражения, стоящего после throw, определяет тип порождаемого исключения. При генерации исключения выполнение текущего блока прекращается, и происходит поиск соответствующего обработчика и передача ему управления. Обработчики исключенийначинаются с ключевого слова catch, за которым в скобках следует тип обрабатываемого исключения. Синтаксис обработчиков напоминает определение функции с одним параметром — типом исключения. Существует три формы записи:
Catch (тип имя) { ... /* тело обработчика */ } Catch (тип) { ... /* тело обработчика */ } Catch (...) { .. /* тело обработчика */ }
Первая форма применяется, когда имя параметра используется в теле обработчика для выполнения каких-либо действий — например, вывода информации об исключении. Вторая форма не предполагает использования информации об исключении, играет роль только его тип. Многоточие вместо параметра обозначает, что обработчик перехватывает все исключения. Так как обработчики просматриваются в том порядке, в котором они записаны, обработчик третьего типа следует помещать после всех остальных.
Когда с помощью throw генерируется исключение, функции исполнительной библиотеки C++ выполняют следующие действия: 1. Создают копию параметра throw в виде статического объекта, который существует до тех пор, пока исключение не будет обработано; 2. В поисках подходящего обработчика раскручивают стек, вызывая деструкторы локальных объектов, выходящих из области действия; 3. Передают объект и управление обработчику, имеющему параметр, совместимый по типу с этим объектом.
При раскручивании стека все обработчики на каждом уровне просматриваются последовательно, от внутреннего блока к внешнему, пока не будет найден подходящий обработчик. Обработчик считается найденным, если тип объекта, указанного после throw: · тот же, что и указанный в параметре catch (параметр может быть записан в форме Т, const Т. Т& или const Т&. где Т— тип исключения); · является производным от указанного в параметре catch (если наследование производилось с ключом доступа public); · является указателем, который может быть преобразован по стандартным правилам преобразования указателей к типу указателя в параметре catch.
Таким образом, механизм исключений позволяет корректно уничтожать объекты при возникновении ошибочных ситуаций. Поэтому выделение и освобождение ресурсов полезно оформлять в виде классов: конструктор которых выделяет ресурс, а деструктор освобождает.
|