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

Содержание

Слайд 2

В PL/SQL ошибки всех видов интерпретируются как исключения — ситуации, которые не

В PL/SQL ошибки всех видов интерпретируются как исключения — ситуации, которые не
должны возникать при выполнении программы. При возникновении ORA-XXXX инициируется исключение. Выполнение программы прекращается и управление передается разделу обработки исключения, если он есть.
Способы инициации исключения :
ошибки, генерируемые системой (нехватка памяти, места и тп);
ошибки, вызванные действиями пользователя (констрейнты, типы данных);
предупреждения, выдаваемые приложением пользователю. Явный вызов исключения разработчиком в коде программы. (нарушение логики работы)
Способы обработки исключения:
Обработать в том же блоке.
Передать ошибку в вызываемую среду.

Обработка исключительных ситуаций

Слайд 3

Обработка исключительных ситуаций

Обработка
исключения в
том же блоке.
Исключение
обработано

Передача исключения
во внешнюю среду.
Исключение не обработано и

Обработка исключительных ситуаций Обработка исключения в том же блоке. Исключение обработано Передача
передается внешней среде

DECLARE

BEGIN

EXCEPTION

END

DECLARE

BEGIN

EXCEPTION

END

Возникло
исключение
или
инициация
исключения

DECLARE

BEGIN

END

Исключение не обработано,
передается внешней среде

Слайд 4

С ключевого слова EXCEPTION начинается блок обработки особых ситуаций.
Допустимо использование нескольких обработчиков

С ключевого слова EXCEPTION начинается блок обработки особых ситуаций. Допустимо использование нескольких
событий
Ключевое слово WHEN OTHERS должно быть указано в конце блока обработки.

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

Слайд 5

DECALRE
BEGIN
……
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
...
[WHEN exception3 [OR exception4

DECALRE BEGIN …… EXCEPTION WHEN exception1 [OR exception2 . . .] THEN
. . .] THEN
statement1;
statement2;
...]
[WHEN OTHERS THEN
statement1;
statement2;
...]
END; * Блоки begin exception end м.б. вложенными

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

Слайд 6

Предопределенные ошибки Oracle

Не требуют объявления, доступны всегда. Часто возникающие ошибки:
TOO_MANY_ROWS
NO_DATA_FOUND
INVALID_CURSOR
CURSOR_ALREADY_OPEN
NOT_LOGGED_ON
PROGRAM_ERROR

Предопределенные ошибки Oracle Не требуют объявления, доступны всегда. Часто возникающие ошибки: TOO_MANY_ROWS

Слайд 7

Для ссылки на предопределенные исключения используются стандартные, зарезервированные описатели исключений.
Предопределенные исключения:

Исключения предопределенные

Для ссылки на предопределенные исключения используются стандартные, зарезервированные описатели исключений. Предопределенные исключения: Исключения предопределенные ORACLE
ORACLE

Слайд 8

Исключения предопределенные ORACLE

Исключения предопределенные ORACLE

Слайд 9

BEGIN
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN OTHERS THEN
statement1;
statement2;
statement3;
END;

Пример

BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1;

Слайд 10

Не предопределенные ошибки Oracle

Не предопределенные ошибки обрабатываются в блоке исключения как и

Не предопределенные ошибки Oracle Не предопределенные ошибки обрабатываются в блоке исключения как
предопределенные, но в секции OTHERS Для получения информации о коде исключения используем функцию SQLCODE, информация о сообщении функция SQLERRM

Можно предопределить любимые ошибки (связать номер ORA-XXXX и имя) в DECLARE и обращаться по имени как с предопределенными.

Слайд 11

Функции SQLCODE SQLERRM

SQLCODE: Возвращает числовое значение для кода последней возникшей ошибки (кроме

Функции SQLCODE SQLERRM SQLCODE: Возвращает числовое значение для кода последней возникшей ошибки
NO_DATA_FOUND для нее =100).
SQLERRM: Возвращает текст, связанный с номером ошибки.
ORA-00001: unique constraint (string.string) violated
Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
Action: Either remove the unique restriction or do not insert the key.
SQLCODE =-1
SQLERRM: ORA-00001: нарушено ограничение уникальности
* Список ошибок Oracle - Database Error Messages https://docs.oracle.com/database/121/ERRMG/toc.htm

Слайд 12

Не предопределенные исключения Oracle

Объявление

Ассоциация

Ссылка

DECLARE декларативный раздел

Раздел обработки
Исключений EXCEPTION

Имя исключения

Код PRAGMA

Не предопределенные исключения Oracle Объявление Ассоциация Ссылка DECLARE декларативный раздел Раздел обработки
EXCEPTION_INIT

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

Требуют объявления (или анализа кода ошибки)

Слайд 13

Обработка исключения ORA–2292 нарушение ограничения целостности: ORA-02292: violated integrity constraint (owner.constraintname)- child

Обработка исключения ORA–2292 нарушение ограничения целостности: ORA-02292: violated integrity constraint (owner.constraintname)- child
record found
DECLARE
ERROR_DELETE_MY EXCEPTION;
PRAGMA EXCEPTION_INIT(ERROR_DELETE_MY,-2292);
v_deptno DEPARTMENTS.DEPARTMENT_ID%TYPE :=30;
BEGIN
DELETE FROM DEPARTMENTS WHERE DEPARTMENT_ID = v_deptno;
EXCEPTION
WHEN ERROR_DELETE_MY THEN
DBMS_OUTPUT.PUT_LINE('Cannot remove dept' || TO_CHAR(v_deptno) || '. Employees exist.');
END;

Пример

1

2

3

* Демонстрация 3-режимов см сноску:
Без EXCEPTION
OTHERS
Предопределение

Слайд 14

Пример логирования ошибок

DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM

Пример логирования ошибок DECLARE v_error_code NUMBER; v_error_message VARCHAR2(255); BEGIN ... EXCEPTION ...
;
INSERT INTO errors
VALUES(v_error_code, v_error_message);
END;

Слайд 15

Обработка пользовательских исключений

Объявление

Инициация

Ссылка

Декларативный
раздел

Раздел обработки
исключений

Имя исключения

Явный вызов
исключения,
используя
слово RAISE

Обработка пользовательских исключений Объявление Инициация Ссылка Декларативный раздел Раздел обработки исключений Имя
Обработка
исключения

Исполняемый
раздел

RAISE имя_исключения;
RAISE_APPLICATION_ERROR (номер, текст, флаг);

Слайд 16

Обработка пользовательских исключений

DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE dept SET dname =’Testers’
WHERE deptno =11111;
IF SQL%NOTFOUND

Обработка пользовательских исключений DECLARE e_invalid_department EXCEPTION; BEGIN UPDATE dept SET dname =’Testers’
THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE(’No such department id.’);
END;

1

2

3

Чтобы программист имел возможность самостоятельно инициировать исключения, в Oracle поддерживается команда RAISE. С ее помощью можно инициировать как собственные, так и системные исключения.

Слайд 17

RAISE_APPLICATION_ERROR

Предназначена для генерации ошибок, установленных пользователем.
Преимущество перед командой RAISE (которая тоже может

RAISE_APPLICATION_ERROR Предназначена для генерации ошибок, установленных пользователем. Преимущество перед командой RAISE (которая
инициировать явно объявленные исключения) заключается в том, что она позволяет связать с исключением сообщение об ошибке.
Диапазон ошибок, доступный пользователю: -20000...-20999

raise_application_error (error_number,
message[, {TRUE|FALSE}]);

Слайд 18

RAISE_APPLICATION_ERROR

Используется в двух различных местах:
- Выполнимый раздел. Пример 1 след слайд
- Раздел

RAISE_APPLICATION_ERROR Используется в двух различных местах: - Выполнимый раздел. Пример 1 след
Исключения . Пример 1 след слайд
Возвращает ошибку пользователю аналогичным способом, принятым в сервере ORACLE. Номер и текст.

Слайд 19

Примеры

Пример 2
...
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20201,’This is not a valid employee’);
END;

Пример 1
...
DELETE

Примеры Пример 2 ... EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20201,’This is not
FROM emp
WHERE mgr = v_mgr;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR (-20202,’This is not a
valid manager’);
END IF;

* Демонстрация RAISE vs RAISE_APPLICATION_ERROR

Слайд 20

Передача исключений во внешнюю среду

Сначала PL/SQL ищет обработчик исключения в текущем блоке

Передача исключений во внешнюю среду Сначала PL/SQL ищет обработчик исключения в текущем
(анонимном блоке, процедуре или функции). Если такового нет, PL/SQL пытается обработать исключение, инициировав его еще раз в родительском блоке. Так происходит в каждом внешнем по отношению к другому блоке до тех пор, пока все они не будут исчерпаны. После этого PL/SQL возвращает необработанное исключение в среду приложения, выполнившего ≪самый внешний≫ блокPL/SQL.

Слайд 21

Итоги

Исключения
Предопределенные Oracle
Не предопределенные исключения
Пользовательские
Инициализация и обработка исключений

Итоги Исключения Предопределенные Oracle Не предопределенные исключения Пользовательские Инициализация и обработка исключений