当引发异常时,如果PL/SQL在当前块或子程序中找不到该异常的处理程序,则异常会
向上传播。也就是说,异常在层层父块中复制自身,直到找到一个处理程序为止。如果最
后也找不到处理程序,PL/SQL将向主机环境返回一个未处理的异常错误。
下图说明了基本的传播规则。
GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 126 -
子块中抛出的异常A在子块中就被截获并处理了,此时控制权交给了父块。
子块中抛出的异常B在父块中被截获并处理了,此时控制权交给了外部环境。
GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 127 -
子块中抛出的异常C没有被截获,因此返回给执行环境一个错误:未处理的异常。
异常可以传播到其作用域之外,也就是说,在声明它的块之外。 例如:
BEGIN
DECLARE ---------- 子块开始
past_due EXCEPTION; --子块中声明的异常
due_date DATE := trunc(SYSDATE) - 1;
todays_date DATE := trunc(SYSDATE);
BEGIN
IF due_date < todays_date THEN
RAISE past_due; --抛出异常past_due
END IF;
END; ------------- 子块结束
EXCEPTION
WHEN OTHERS THEN -- 处理异常
ROLLBACK;
END;
由于声明异常past_due的块没有处理异常,因此异常将传播到父块。但是,父块不能
引用past_due的名称,因为它声明的范围不再存在。一旦异常名称不再存在,只有
OTHERS处理程序才能截获这个异常。