Язык PL/SQL. Иван Сергеевич Задворьев

Чтение книги онлайн.

Читать онлайн книгу Язык PL/SQL - Иван Сергеевич Задворьев страница 17

Язык 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; –

Скачать книгу