7
Поиск обработчика
Необработанная ошибка «поднимается» на уровень выше
в объемлющий блок PL/pgSQL, если он есть
в вызывающую подпрограмму, если она есть
Поиск обработчика определяется стеком вызовов
то есть не определен статически, а зависит от выполнения программы
Никем не обработанная ошибка отправляется клиенту
транзакция переходит в состояние сбоя, клиент должен ее откатить
информация об ошибке записывается в журнал сообщений сервера
Если ни одно из условий, перечисленных в секции EXCEPTION, не
сработает, то ошибка «поднимается» на уровень выше.
Если ошибка возникла в блоке, вложенном в другой блок, то сервер
будет пытаться найти обработчик в объемлющем блоке. Если и там не
найдется подходящего обработчика, весь объемлющий блок будет
считаться ошибочным, и ошибка поднимется еще выше, и так далее.
Если мы перебрали все объемлющие блоки и не обнаружили
подходящего обработчика возникшей ошибки, ошибка «поднимается»
на уровень той подпрограммы, которая вызвала наш блок. То есть
чтобы разобраться, в каком порядке будут просматриваться
обработчики ошибки, надо проанализировать стек вызовов.
Если ни один из возможных обработчиков ошибки не сработает:
- сообщение об ошибке обычно попадает в журнал сообщений сервера
(это зависит от настроек сервера, см. тему «PL/pgSQL. Отладка»);
- об ошибке сообщается клиенту, который инициировал вызов кода
в базе данных. Клиент ставится перед фактом: транзакция переходит
в состояние сбоя, и ее можно только откатить.
Как именно клиент будет обрабатывать ошибку, зависит от него самого.
Например, psql выведет сообщение об ошибке и всю доступную
диагностическую информацию. Клиент, ориентированный на конечного
пользователя, может вывести знаменитое «обратитесь к системному
администратору» и т. д.