问题描述
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;
/