Неструктурная обработка исключений

Неструктурная обработка исключений реализуются в виде механизма регистрации функций или команд-обработчиков для каждого возможного типа исключения. Язык или системные библиотеки предоставляютпрограммисту как минимум две стандартные процедуры: регистрации обработчика и разрегистрацииобработчика. Вызов первой из них «привязывает» обработчик к определённому исключению, вызов второй —отменяет эту «привязку». Если исключение происходит, выполнение основного кода программы немедленнопрерывается и начинается выполнение обработчика. По завершении обработчика управление передаётсялибо в некоторую наперёд заданную точку программы, либо обратно в точку возникновения исключения (взависимости от заданного способа обработки — с возвратом или без). Независимо от того, какая частьпрограммы в данный момент выполняется, на определённое исключение всегда реагирует последнийзарегистрированный для него обработчик. В некоторых языках зарегистрированный обработчик сохраняетсилу только в пределах текущего блока кода (процедуры, функции), тогда процедура разрегистрации нетребуется. Ниже показан условный фрагмент кода программы с неструктурной обработкой исключений:

УстановитьОбработчик(ОшибкаБД, ПерейтиНа ОшБД) // На исключение "ОшибкаБД" установлен обработчик - команда "ПерейтиНа ОшБД"

... // Здесь находятся операторы работы с БД

ПерейтиНа СнятьОшБД // Команда безусловного перехода - обход обработчика исключений

ОшБД: // метка - сюда произойдёт переход в случае ошибки БД по установленному обработчику

... // Обработчик исключения БД

СнятьОшБД: // метка - сюда произойдёт переход, если контролируемый код выполнится без ошибки БД.

СнятьОбработчик(ОшибкаБД) // Обработчик снят

Неструктурная обработка — практически единственный вариант для обработки асинхронных исключений, нодля синхронных исключений она неудобна: приходится часто вызывать команды установки/снятияобработчиков, всегда остаётся опасность нарушить логику работы программы, пропустив регистрацию илиразрегистрацию обработчика.

Структурная обработка исключений

Структурная обработка исключений требует обязательной поддержки со стороны языка программирования— наличия специальных синтаксических конструкций. Такая конструкция содержит блок контролируемогокода и обработчик (обработчики) исключений. Наиболее общий вид такой конструкции (условный):

НачалоБлока

... // Контролируемый код

...

если (условие) то СоздатьИсключение Исключение2

...

Обработчик Исключение1

... // Код обработчика для Исключения1

Обработчик Исключение2

... // Код обработчика для Исключения2

ОбработчикНеобработанных

... // Код обработки ранее не обработанных исключений

КонецБлока

Здесь «НачалоБлока» и «КонецБлока» — ключевые слова, которые ограничивают блок контролируемогокода, а «Обработчик» — начало блока обработки соответствующего исключения. Если внутри блока, отначала до первого обработчика, произойдёт исключение, то произойдёт переход на обработчик, написанныйдля него, после чего весь блок завершится и исполнение будет продолжено со следующей за ним команды. «ОбработчикНеобработанных» — это обработчик исключений, которые не соответствуют ни одному изописанных выше в данном блоке. Обработчики исключений в реальности могут описываться по-разному(один обработчик на все исключения, по одному обработчику на одно исключение и так далее), нопринципиально они работают одинаково: при возникновении исключения находится первыйсоответствующий ему обработчик в данном блоке, его код выполняется, после чего выполнение блоказавершается. Исключения могут возникать как в результате программных ошибок, так и путём явной ихгенерации с помощью соответствующей команды (в примере — команда «СоздатьИсключение»). С точкизрения обработчиков такие искусственно созданные исключения ничем не отличаются от любых других.

Блоки обработки исключений могут многократно входить друг в друга, как явно (текстуально), так и неявно(например, в блоке вызывается процедура, которая сама имеет блок обработки исключений). Если ни одиниз обработчиков в текущем блоке не может обработать исключение, выполнение данного блока немедленнозавершается, и управление передаётся на ближайший подходящий обработчик более высокого уровняиерархии. Это продолжается до тех пор, пока обработчик не найдётся и не обработает исключение.

Иногда бывает неудобно завершать обработку исключения в текущем блоке, то есть желательно, чтобы привозникновении исключения в текущем блоке обработчик выполнил какие-то действия, но исключениепродолжило бы обрабатываться на более высоком уровне (обычно так бывает, когда обработчик данногоблока не полностью обрабатывает исключение, а лишь частично). В таких случаях в обработчике исключенийгенерируется новое исключение или возобновляется с помощью специальной команды ранее появившееся.Код обработчиков не является защищённым в данном блоке, поэтому созданное в нём исключение будетобрабатываться в блоках более высокого уровня.

Блоки с гарантированным завершением

Помимо блоков контролируемого кода для обработки исключений, языки программирования могутподдерживать блоки с гарантированным завершением. Их использование оказывается удобным тогда, когдав некотором блоке кода, независимо от того, произошли ли какие-то ошибки, необходимо перед егозавершением выполнить определённые действия. Простейший пример: если в процедуре динамическисоздаётся какой-то локальный объект в памяти, то перед выходом из этой процедуры объект должен бытьуничтожен (чтобы избежать утечки памяти), независимо от того, произошли после его создания ошибки илинет. Такая возможность реализуется блоками кода вида:

НачалоБлока

... // Основной код

Завершение

... // Код завершения

КонецБлока

Заключённые между ключевыми словами «НачалоБлока» и «Завершение» операторы (основной код)выполняются последовательно. Если при выполнении их не возникает исключений, то затем выполняютсяоператоры между ключевыми словами «Завершение» и «КонецБлока» (код завершения). Если же привыполнении основного кода возникает исключение (любое), то сразу же выполняется код завершения, послечего весь блок завершается, а возникшее исключение продолжает существовать и распространяться до техпор, пока его не перехватит какой-либо блок обработки исключений более высокого уровня.

Принципиальное отличие блока с гарантированным завершением — он не обрабатывает исключение, алишь гарантирует выполнение определённого набора операций перед тем, как включится механизмобработки. Стоит заметить, что блок с гарантированным завершением легко реализуется с помощью команд«возбудить исключение» и «структурный обработчик исключения».


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: