Иван Задворьев - Язык PL/SQL
- Название:Язык PL/SQL
- Автор:
- Жанр:
- Издательство:Array SelfPub.ru
- Год:2018
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Иван Задворьев - Язык PL/SQL краткое содержание
Язык PL/SQL - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
– подходит по имени к ZERO_DIVIDE (поймали), заходим внутрь обработчика
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Ошибка деления на ноль');
– OTHERS ловит все, что не поймали другие до него,
– но сюда в этом случае «примерка» не дошла, раньше поймали
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('При выполнении произошла ошибка '||SQLERRM);
END;
При инициировании исключения в блоке PL/SQL выполнение потока команд блока прекращается, и управление передается в раздел обработки исключений этого блока, если такой раздел есть, или в родительский блок, если раздела обработки исключений у блока нет.
Сразу после инициирования исключение получает статус «не обработано», и можно сказать, что с этим статусом исключение бросается и летит над кодом программы. Летит оно именно над кодом, пропуская все команды исполняемых разделов, задерживаясь только в разделах обработки исключений вложенных блоков. Полет исключения прекращается в том блоке, в разделе обработки исключений которого исключение смогли поймать и обработать. Сразу после этого управление будет передано блоку, родительскому по отношению к тому блоку, где эта обработка произошла.
Действия в разделе обработки исключений
В разделе обработки исключений прилетевшее исключение пытаются обработать имеющимися в этом разделе обработчиками исключений, которых в блоке может быть несколько. После передачи управления в раздел обработки исключений осуществляется два действия:
определение, какой обработчик в разделе ловит прилетевшее исключение («примерка» обработчиков);
обработка исключения подходящим обработчиком.
«Примерка» обработчиков осуществляется по именам исключений – перед каждым обработчиком указывается список имен исключений, которые он ловит.
Если исключение не имеет имени или его имя не соответствует ни одному из имен исключений, указанных в разделе обработки исключений, то оно обрабатывается OTHERS-обработчиком, если он имеется. OTHERS-обработчик в разделе обработки исключений указывается последним и на него возлагается задача поймать все то, что не поймали другие обработчики перед ним – и системные исключения и пользовательские исключения с любыми именами.
После прилета исключения в раздел обработки возможны два случая:
если никакой обработчик исключению не подошел, то исключение со статусом «не обработано» бросается в дальнейший полет уже в родительском блоке (блоке, предыдущим по вложенности) с того места кода, где заканчивается вложенный блок;
если в результате «примерки» нашелся подходящий исключению обработчик, то управление передается ему.
Работа обработчика свою очередь может завершиться тремя исходами:
команды обработчика успешно выполнились, исключение получает статус «обработано» и управление передается родительскому блоку в то место кода, где заканчивается вложенный блок;
в процессе работы обработчика принято решение, что обрабатывать исключение надо не в этом обработчике, тогда исключение здесь же в обработчике инициируется повторно вызовом команды RAISE без параметров;
в ходе выполнения команд обработчика инициировано новое исключение (такое бывает, например, если в обработчике ошибки регистрируются в специальной таблице, а для нее кончилось место), прилетевшее исходное исключение тогда получает статус «обработано».
Два последних исхода работы обработчика предполагают, что из блока даже с подходящим обработчиком исключение бросится дальше – либо то же самое (после вызова команды RAISE), либо уже другое. Могло прилететь пользовательское исключение, обработаться со своей ошибкой, поэтому из обработчика бросится и в родительском блоке полетит дальше уже системное исключение, как в примере с ошибкой добавления строки в специальную таблицу журнала ошибок.
Примеры обработки исключений
Рассмотрим примеры полетов исключений в программе из трех вложенных блоков:
BEGIN – начало блока1
команда1_блока1;
команда2_блока1;
команда3_блока1;
BEGIN – начало блока2
команда1_блока2;
команда2_блока2 l_int := 1/TO_NUMBER(l_var) (l_var='1' или '0' или 'a')
команда3_блока2;
EXCEPTION
WHEN ZERO_DIVIDE THEN
команда1_zero_блока2;
команда2_zero_блока2;
END; – конец блока2
команда4_блока1;
команда5_блока1;
EXCEPTION
WHEN ZERO_DIVIDE THEN
команда1_zero_блока1;
команда2_zero_блока1;
WHEN OTHERS THEN
команда1_others_блока1;
команда2_others_блока1;
END; – конец блока 1
Пусть команда2_блока2 имеет вид l_int:=1/TO_NUMBER(l_var); где l_int – целочисленная переменная, l_var – символьная.
l_var='1' (без исключений)
l_var='0' (zero divide)
l_var='a' (conversion error)
команда1_блока1;
команда2_блока1;
команда3_блока1;
команда1_блока2;
команда2_блока2;
команда3_блока2;
команда4_блока1;
команда5_блока1;
команда1_блока1;
команда2_блока1;
команда3_блока1;
команда1_блока2;
команда2_блока2(error);
– в блоке 2
– ловится ZERO_DIVIDE:
команда1_zero_блока2;
команда2_zero_блока2;
–продолжение блока 1:
команда4_блока1;
команда5_блока1;
команда1_блока1;
команда2_блока1;
команда3_блока1;
команда1_блока2;
команда2_блока2(error);
–в блоке 2 ошибка
–преобразования
–не ловится, т.к.
–там только ZERO_DIVIDE
– в блоке 1
– ZERO_DIVIDE
– второй раз не ловит,
– а ловит OTHERS
– (он же все ловит):
команда1_others_блока1;
команда2_others_блока1;
Рассмотрим три случая в зависимости от значения, которое принимает переменная l_var ('1', или '0', или 'a').
Когда l_var=1 (первый столбец таблицы) исключения не инициируются выполняются все команды из разделов выполнения в той последовательности, как они записаны в коде.
В случае ошибки деления на ноль (второй столбец таблицы, l_var='0') в команде2_блока2 выполнение блока 2 прекращается, все остальные команды в блоке 2 после нее не выполняются, управление передается в раздел EXCEPTION блока 2, где пытаются поймать исключение деления на ноль (ZERO_DIVIDE). Подходящий обработчик в разделе обработки исключений блока 2 есть, поэтому исключение ловится в блоке 2, в котором успешно выполняются команды обработчика. После успешной обработки продолжается выполнение команд блока 1, родительского для блока 2, в котором произошла обработка исключения.
В случае ошибки преобразования символа к числу (третий столбец таблицы, l_var='a') исключение ошибки преобразования не ловится в разделе EXCEPTION блока 2 и PL/SQL передает управление в родительский блок 1, сразу после END блока 2 и исключение пытаются поймать в разделе EXCEPTION блока 1. В разделе обработки исключений блока 1 есть два обработчика (ZERO_DIVIDE и OTHERS). «Примерка» обработчиков к прилетевшему исключению начинается в той последовательности, как они записаны в коде (сверху вниз). ZERO_DIVIDE для этого исключения не подходит при «примерке» уже второй раз, а OTHERS-обработчик ловит все исключения, поэтому управление передается ему и выполняются две его команды. После успешного выполнения команд обработчика исключение получает статус «обработано».
Читать дальшеИнтервал:
Закладка: