Статья основана на двадцать пятом видео из 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 внешнего блока.
Как их обрабатывать и какие есть нюансы мы узнаем в следующей статье.
Больше примеров доступно на гитхабе и в видео.
Добавить комментарий