RAISE_APPLICATION_ERROR выдает ошибку на заказ.Но, как и любое другое исключение, которое может вызвать наше приложение, оно перехватывается локальным обработчиком исключений.
Ваш обработчик исключений вызывает новое сделанное на заказ исключение для любых ошибок.Не делай этого.Вы можете легко решить вашу проблему, удалив блок исключения.Все исключения будут распространяться вверх по стеку вызовов без каких-либо изменений.
begin
-----------------------------
-----some code statements----
-----------------------------
if (<condition 1>) then
-----------------
----some code----
-----------------
elsif(<condition 2>) then
raise_application_error(-20001, '----statement1----');
elseif(<condition 3>) then
raise_application_error(-20002), '----statement2----');
end if;
end;
Кроме того, вы можете использовать определяемые пользователем исключения.
declare
x_condition2 exception;
x_condition3 exception;
begin
-----------------------------
-----some code statements----
-----------------------------
if (<condition 1>) then
-----------------
----some code----
-----------------
elsif(<condition 2>) then
raise x_condition2;
elseif(<condition 3>) then
raise x_condition3;
end if;
exception
when x_condition2 then
raise_application_error(-20001, '----statement1----');
when x_condition3 then
raise_application_error(-20002, '----statement2----');
end;
Вам все равно не нужно беспокоиться, КОГДА ДРУГИЕесли у вас нет какой-то конкретной обработки , которую вы хотите применить ко всем ошибкам (таким как их регистрация).Нет смысла просто повторно вызывать исключение в секции обработчика, потому что распространение происходит по умолчанию.
@ Deep ask
не можем ли мы сделать оба исключения?
Да, мы можем сделать это:
declare
x_condition2 exception;
PRAGMA EXCEPTION_INIT(x_condition2,-20001);
x_condition3 exception;
PRAGMA EXCEPTION_INIT(x_condition3,-20002);
….
Объявление исключения создает исключение на заказ.PRAGMA EXCEPTION_INIT связывает заказной номер ошибки с этим исключением.Я бы не стал делать это в анонимном блоке, потому что мы не получаем от этого особой выгоды.Нам все еще нужно было бы выполнить raise_application_error
, чтобы вернуть наши специальные сообщения об ошибках.
Когда pragma exception_init
становится действительно полезным, когда мы передаем исключения между программными модулями.Исключения, которые должны обрабатываться вызывающими программами, должны быть объявлены в спецификациях пакета.Использование pragma exception_init
означает, что мы можем идентифицировать ошибки, используя sqlcode
, что может быть полезно для таких задач, как поиск стандартных сообщений об ошибках из таблицы, предоставление текста справки пользователя и т. Д.