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

问题描述

我有一个如下所示的匿名阻止

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;
/