Страницы

18 июня 2012 г.

PostgreSQL. Обработка исключений внутри функций.

Добро пожаловать в "Будни программиста"
       Сегодня вернулся к написанию хранимых процедур на plpgsql. После долгого периода некоторые моменты изрядно подзабылись. В том числе и синтаксис, да и вообще механизм обработки исключений. В связи с этим, хочу создать этот пост-пометку. Надеюсь он мне больше не понадобится, ибо если я забуду это еще раз, надо будет бежать к хирургу и просить вставить еще пару планок памяти :).

       Общий синтаксис функции с обработчиком исключений выглядит следующим образом:

[ DECLARE
 declarations ]
BEGIN
 statements
EXCEPTION
 WHEN condition [ OR condition ... ] THEN
  handler_statements
 [ WHEN condition [ OR condition ... ] THEN
  handler_statements
   ... ]

END;


За оригиналом примера бежать сюда.

       Блок EXCEPTION должен располагаться в конце блока begin..end, он является глобальным для всего блока, и может иметь множество обработчиков разных типов исключений (если в функции несколько блоков begin..end, то каждый блок может иметь свою секцию EXCEPTION). Обработка исключения какого-либо типа (типов) начинается строкой "WHEN condition [ OR condition ... ] THEN". Таких строк, как видно из описания синтаксиса, может быть множество, под каждый отдельный тип или перечень типов ([ OR condition ... ]) исключений.
       Выражение condition непосредственно опаределяет тип обрабатываемого исключения, вось перечень можно подсмотреть здесь.
       Далее, мы выдим handler_statements. На месте этого выражение пишется обработчик исключения.

Внимание!
Если вы хотите перехватывать все виды исключений, то на место condition нужно написать OTHERS.

Вот небольшой пример:

create or replace function test_exception()
returns void as
$body$
begin
 select 10/0;
exception
 when division_by_zero then
      raise notice 'Ohhh....';
end;
$body$
language 'plpgsql';

select test_exception();

Результат:
NOTICE:  Ohhh....
Суммарное время выполнения запроса:21 ms.
1 row retrieved.

Комментариев нет:

Отправить комментарий