调用用户定义的异常,但在引发其他异常时调用



我有一个匿名块,如下

DECLARE
exc1 EXCEPTION;
i integer:='1';
BEGIN
BEGIN
IF i = 1 THEN
RAISE exc1;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20481,
'Error while inserting/update into Table- ' ||
SQLERRM);
END;
EXCEPTION
WHEN exc1 THEN
raise_application_error(-20001, 'test123');
END;

我只想提出exc1异常。但此处当其他异常正在引发时。我特别在if条件块中引发异常exc1,所以它必须调用对吗?

这里最好的选择是只有一个异常块:

DECLARE
exc1 EXCEPTION;
i integer:='1';
BEGIN
IF i = 1 THEN
RAISE exc1;
END IF;
EXCEPTION
WHEN exc1 THEN
raise_application_error(-20001, 'test123');
WHEN OTHERS THEN
raise_application_error(-20481,
'Error while inserting/update into Table- ' ||
SQLERRM);
END;
/

但是,如果真的需要带有自己的异常块的嵌套匿名块,则需要再添加一个异常处理程序:

DECLARE
exc1 EXCEPTION;
i integer:='1';
BEGIN
BEGIN
IF i = 1 THEN
RAISE exc1;
END IF;
EXCEPTION
WHEN exc1 THEN
raise;
WHEN OTHERS THEN
raise_application_error(-20481,
'Error while inserting/update into Table- ' ||
SQLERRM);
END;
EXCEPTION
WHEN exc1 THEN
raise_application_error(-20001, 'test123');
END;
/

PS。我建议您在不将原始异常添加到错误堆栈中的情况下不要使用when others then,即raise_application_error((的第三个参数应该是true:

DECLARE
exc1 EXCEPTION;
i integer:='1';
BEGIN
IF i = 1 THEN
RAISE exc1;
END IF;
EXCEPTION
WHEN exc1 THEN
raise_application_error(-20001, 'test123', true);
WHEN OTHERS THEN
raise_application_error(-20481,
'Error while inserting/update into Table- ' ||
SQLERRM
, true);
END;
/

相关内容

最新更新