Программирование >>  Структурное программирование 

1 ... 236 237 238 [ 239 ] 240 241 242 ... 342


13.6. Блоки try

Исключения, которые генерируется в блоке try, обычно перехватываются обработчиком, описанным в блоке catch, следующем непосредственно за этим блоком try.

try { }

catch { ) { }

За блоком try может не следовать ни одного блока catch, или может следовать несколько таких блоков. Если при выполнении блока try не генерируется ни одно исключение, все обработчики исключений пропускаются и управление передается первому оператору после последнего обработчика.

13.7. Генерация исключений

Ключевое слово throw используется для того, чтобы указать, какое исключение генерируется. Это называется генерацией исключения или возбуждением исключения. Обычно throw имеет один операнд (специальный случай без операндов мы обсудим отдельно). Операнд throw может быть любого типа. Если операнд является объектом, мы называем его объектом исключения. Вместо объекта может быть сгенерировано условное выражение (см. раздел 13.10). Можно также генерировать объекты, не предназначенные для обработки ошибок.

Где перехватывается исключение? После генерации исключение будет перехвачено ближайшим обработчиком исключений (ближайшим к блоку try, в котором было сгенерировано исключение), содержащим спецификацию соответствующего типа. Обработчики исключений для блока try перечисляются сразу после него.

В процессе генерации исключения создается и инициализируется временная копия операнда throw. Этот временный объект затем инициализирует параметр в обработчике исключения. Временный объект уничтожается, когда завершается выполнение обработчика исключения и управление передается программе.

Замечание по технике программирования 13.5

Еспи необходимо передать информацию относительно ошибки, которая вызвала исключение, то такая информация может быть помещена в сгенерированный объект. Обработчик catch должен содержать в этом случае имя параметра, через который эта информация может быть принята.

Замечание по технике программирования 13.6

Может быть сгенерирован объект, не содержащий информацию для передачи; в этом случае обработчику достаточно простой информации о том, что сгенерировано исключение данного типа, чтобы правильно выполнить свою задачу.



Когда исключение сгенерировано, программное управление покидает текущий блок try и передается соответствующему обработчику catch (если он существует), расположенному после этого блока try. Возможно, что точка генерации расположена в глубоко вложенной области действия внутри блока try; управление все равно будет передано этому обработчику catch. Возможно также, что точка генерации расположена в глубоко вложенных вызовах функций; и в этом случае управление будет передано этому обработчику catch.

Может оказаться, что сам блок try не содержит никаких проверок ошибок и не включает никаких операторов throw, но код, вызываемый из блока try, может, конечно, содержать контроль ошибок, в частности, в конструкторах. Например, код в блоке try может обрабатывать индексирование массива в объекте класса массив, в котором функция-элемент operator[] может быть перегружена генерацией исключения, связанного с ошибкой выхода индекса за допустимые пределы. Любое обращение к этой функции может сгенерировать исключение или вызвать другую функцию, которая тоже может сгенерировать исключение.

Исключение может прервать выполнение программы, но это не обязательно. Однако, выполнение блока, в котором сгенерировано исключение, завершается.

Типичная ошибка программирования 13.3

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

13.8. Перехват исключений

Обработчики исключений содержатся в блоках catch. Каждый блок catch начинается с ключевого слова catch, за которым следуют круглые скобки, содержащие тип и необязательное имя параметра. Затем в фигурных скобках записываются операторы обработки исключения. Когда исключение перехвачено, начинает выполняться программа в блоке catch.

Типичная ошибка программирования 13.4

Предположение, что после обработки исключения управление вернется к первому оператору после того, который сгенерировал это исключение.

Обработчик catch определяет свою собственную область действия. Обработчик специфицирует в круглых скобках тип объекта, который должен быть перехвачен. Параметр в обработчике catch может быть поименован или нет. Если параметр поименован, на него можно ссылаться в обработчике. Если параметр не назван, а указан только тип соответствующего объекта исключения, то информация из точки генерации обработчику не передается; передается только управление из точки генерации в обработчик. Этого достаточно для большинства исключений.

Типичная ошибка программирования 13.5

Задание разделяемого запятыми списка аргументов catch.



Исключение, у которого тип сгенерированного объекта соответствует типу аргумента в заголовке catch, вызывает выполнение программы обработки этого блока catch.

Исключение перехватывается первым обработчиком catch, следующим за активным в настоящее время блоком try и соответствующим типу сгенерированного объекта. Правила соответствия уже были коротко рассмотрены.

Исключение, которое не перехвачено, вызывает terminate, что по умолчанию приводит к вызову abort для аварийного завершения программы. Можно изменить это поведение, определив другую функцию, которая должна будет выполняться; имя этой функции надо задать как аргумент в обращении к функции set terminate.

Если после catch в круглых скобках записано многоточие:

catch (...)

ЭТО означает, что будут перехватываться все исключения. Типичная ошибка программирования 13.6

Размещение catch (...) перед другими блоками catch препятствует выполнению всех других обработчиков; catch (...) всегда должен размещаться последним в списке обработчиков после блока try, иначе будет зафиксирована синтаксическая ошибка.

Замечание по технике программирования 13.7

Недостаток перехвата исключений с помощью catch (...) заключается в том, что вы обычно не можете знать, каков тип исключения. Другой недостаток заключается в том, что без поименованного параметра не существует никакого способа обратиться в обработчике исключения к объекту исключения.

Возможно, что некоторому сгенерированному объекту не будет соответствовать ни один обработчик. Это вызывает продолжение поиска соответствия в следующем внешнем блоке try, включающем данный. При продолжении этого процесса в конечном счете может быть выяснено, что в программе не существует обработчика, который соответствовал бы типу сгенерированного объекта; в этом случае вызывается функция terminate, которая по умолчанию вызывает функцию abort.

Замечание по технике программирования 13.8

Программист определяет последовательность, в которой перечисляются обработчики исключений. Эта последовательность может влиять на то, как обрабатываются исключения, возникающие в этом блоке try.

Обработчики исключений поочередно просматриваются в поисках соответствующего типа. Выполняется первый обработчик соответствующего типа. Когда он завершает свою работу, управление передается на первый оператор после последнего блока catch, то есть на первый оператор после последнего обработчика исключений этого блока try.

Возможно, что данному типу исключения будут соответствовать несколько обработчиков исключений. В этом случае выполняется первый обработчик, соответствующий типу исключения. Если данному типу соответствуют несколько обработчиков и если они отличаются друг от друга, то последова-



1 ... 236 237 238 [ 239 ] 240 241 242 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика