Формат блока обработки исключений
Определение описания блока обработки исключений.
::=WHEN имя исключения[, …] THEN
[<операторы> | IGNORE]
[WHEN имя исключения[, …] THEN
[<операторы> | IGNORE]]
… [WHEN OTHERS THEN
[<операторы> | IGNORE]]
[WHEN ALL THEN
[<операторы> | IGNORE]]
Синтаксические правила
-
<Имя исключения>[, …]– это одно или более определенных в блоке описаний имен, разделенных запятыми. -
При возникновении исключения переменной, при обработке которой возникло это исключение, присваивается NULL-значение.
-
Фраза
WHEN <список имен исключений> THEN <операторы>задает обработку конкретных декларированных в блоке описаний исключений. Исключения можно группировать в отдельные подгруппы в зависимости от алгоритма их обработки. -
Фраза
WHEN OTHERS THEN <операторы>задает обработку всех декларированных в блоке описаний исключений, обработка которых не предусмотрена в предыдущих фразахWHEN…. -
Фраза
WHEN ALL THEN <операторы>гарантирует обработку всех возникших в процедуре исключений. Она относится ко всем не обрабатываемым в предыдущих фразахWHEN…исключениям (как декларированным в блоке описаний, так и не декларированным). -
Оператор
IGNOREзаставляет процедуру игнорировать перечисленные критичные исключения. Критичными считаются исключения: DIVZERO, UNDEFPROC, BADPARAM, BADRETVAL, BADCURSOR, CURNOTOPEN, OVERFLOW. Некритичные исключения игнорируются по умолчанию.Когда в процедуре происходит указанное исключение, управление передается на соответствующие операторы после
WHEN, которые выполняются до следующегоWHEN, после чего происходит возврат из процедуры (аналогично операторуRETURN). Выполнение процедуры может быть продолжено с помощью оператораGOTO. -
Если конструкции
WHEN,WHEN OTHERSиWHEN ALLне заданы, то исключения, для которых не задан код обработки, но которые определены в блоке описаний, автоматически передаются на верхний уровень (RESIGNAL). Все неопределенные в блоке описаний исключения, кроме критичных для исполнения, игнорируются. Критичными считаются следующие исключения: DIVZERO, UNDEFPROC, BADPARAM, BADRETVAL, BADCURSOR, CURNOTOPEN, OVERFLOW. Если происходит такое исключение, и для него нет обработчика, автоматически выполняетсяRESIGNAL.
Пример блока обработки исключений
exceptions
when notab then
close first_cursor;
goto notab_recovery;
when badcur then
success := false;
when others then
success := false;
resignal;
Пример использования фразы WHEN ALL…
create or replace procedure "te"(in i int) result int for debug
declare
exception e1 for custom 1;
exception e2 for custom 2;
code
if i < 0 then
signal e1;
elseif i > 10 then
signal e2;
endif
execute direct "select * from qwert;";
return 0;
exceptions
when e1 then
return 1;
when others then
return 2;
when all then
return -1;
end;
Примеры использования фразы IGNORE
1)
create or replace procedure TEST (in i int) result int
declare
exception DIVZERO for DIVZERO;
var j int;
code
j:=10/0;
return 1;
exceptions
when DIVZERO then
ignore;
end;
execute TEST(1);
Результат выполнения:
return value = 1
2)
create or replace procedure TEST (in i int) result int
declare
exception DIVZERO for DIVZERO;
exception CURNOTOPEN for CURNOTOPEN;
var j int;
var c cursor(i int);
code
close c;
j:=10;
return j;
exceptions
when DIVZERO
then resignal;
when others
then ignore;
end;
3)
create or replace procedure TEST (in i int) result int
declare
exception CURNOTOPEN for CURNOTOPEN;
exception DIVZERO for DIVZERO;
var j int;
var c cursor(i int);
code
close c;
j:=10;
return j;
exceptions
when all then ignore;
end;
4)
create or replace procedure TEST (in i int) result int
declare
var j int;
var c cursor(i int);
code
close c;
j:=10;
return j;
exceptions
when all then ignore;
end;
5)
create or replace procedure TEST (in i int) result int
declare
exception DIVZERO for DIVZERO;
exception CURNOTOPEN for CURNOTOPEN;
var j int;
var c cursor(i int);
code
close c;
j:=10;
return j;
exceptions
when DIVZERO, CURNOTOPEN then ignore; //
end;