Исключения

Статья основана на двадцать пятом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.

В данной статье подробно разбираются имена условий, секция EXCEPTION, которая помогает перехватить и обработать ошибки.

В прошлой статье мы разобрали такие циклы, как LOOP, EXIT, CONTINUE, WHILE, FOR, FOREACH, FOR-IN-EXECUTE.

Презентация и исходники доступны по ссылке.

EXCEPTION

По умолчанию любая возникающая ошибка прерывает выполнение функции (процедуры) на PL/pgSQL, а также транзакцию, относящуюся к этой функции. Использование в блоке секции EXCEPTION позволяет перехватывать и обрабатывать ошибки.

Синтаксис секции EXCEPTION расширяет синтаксис обычного блока:

[ <<метка>> ]
[ DECLARE
  объявления ]
BEGIN
  операторы
EXCEPTION
  WHEN условие [ OR условие ... ] THEN
    операторы_обработчика
  [ WHEN условие [ OR условие ... ] THEN
    операторы_обработчика
  ... ]
END;

Если ошибок не было, то выполняются все операторы блока и управление переходит к следующему оператору после END. Но если при выполнении оператора происходит ошибка, то дальнейшая обработка прекращается и управление переходит к списку исключений в секции EXCEPTION.

В этом списке ищется первое исключение, условие которого соответствует ошибке. Если исключение найдено, то выполняются соответствующие операторы_обработчика и управление переходит к следующему оператору после END.

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

В качестве условия может задаваться одно из имён, перечисленных в https://www.postgresql.org/docs/current/errcodes-appendix.html

Если задаётся имя категории, ему соответствуют все ошибки в данной категории. Специальному имени условия OTHERS (другие) соответствуют все типы ошибок, кроме QUERY_CANCELED и ASSERT_FAILURE.

Имена условий воспринимаются без учёта регистра

Условие ошибки также можно задать кодом SQLSTATE; например, эти два варианта равнозначны:

WHEN SQLSTATE '22012' THEN ...
WHEN division_by_zero THEN …

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

Как их обрабатывать и какие есть нюансы мы узнаем в следующей статье.

Больше примеров доступно на гитхабе и в видео.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

8 − 1 =