592 ___ ________Часть IV. Новые возможности C++
могут эмулировать. Процесс вызова деструкторов локальных объектов, когда исключительные ситуации выводят их из области видимости, часто называют развертыванием стека (unwinding the stack).
Изучение блоков fry
Давайте более пристально рассмотрим, что же такое блок try. Синтаксис блока try выглядит следующим образом:
try:
составной оператор блока, за которым следует список обработчиков
В этой синтаксической формуле следует отметить два важных момента. После ключевого слова try должен следовать составной оператор (блок кода, отделенный от текущей области видимости фигурными скобками). Блоки try не имеют однострочной формы наподобие той, которая допустима для операторов if, while и for; это различие иллюстрируется в листинге 22.9.
// Правильно: оператор в "if" не обязан быть составным if (а > Ь)
cout « "а больше Ь.\п";
// Правильно: оператор в "for" не обязан быть составным for (loop = 0; loop < numberOfElements; loop++) ProcessElement() ;
// Неправильно: блок try обязан быть составным оператором try
ProcessElement() ;
// Правильно: составной оператор в блоках try // (состоящий из единственной строки)
try ( . ProcessElement() ;
}
// Правильно try (
ProcessFirstElements() ;
ProcessSecondElements() ;
i
Второй важный факт, вытекающий из приведенной синтаксическое формулы, заключается в том, что непосредственно за блоком try должен следовать по меньшей мере один обработчик. Это, надо сказать, вполне логично: раз вы собираетесь перехватывать исключительные ситуации, то компилятору следует указать, куда их нужно направлять. Листинг 22.10 демонстрирует примеры правильного и неправильного применения этого правила.