首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

PL\SQL用户指南与参照7.1 转载

2012-08-11 
PL\SQL用户指南与参考7.1转载异常可以跨作用域传递,也就是说,它能够超越声明它的块的范围而存在。如下例所

PL\SQL用户指南与参考7.1 转载

异常可以跨作用域传递,也就是说,它能够超越声明它的块的范围而存在。如下例所示:

BEGIN
??...
??DECLARE???--?sub-block?begins
????past_due???EXCEPTION;
??BEGIN
????...
????IF?...?THEN
??????RAISE?past_due;
????END?IF;
??END;???--?sub-block?ends
EXCEPTION
??...
??WHEN?OTHERS?THEN
????ROLLBACK;
END;

因为异常past_due所在的块并没有专门针对它的处理程序,所以异常就被传递到封闭块。但是,按照作用域规则,封闭块是不能引用子块声明的异常。所以,只有OTHERS处理器才能捕获到这个异常。如果没有用户定义异常的处理程序,调用这个程序就会得到下面的错误:

ORA-06510:?PL/SQL:?unhandled?user-defined?exception

七、重新抛出PL/SQL异常

有时我们需要重新抛出捕获到异常,也就是说,我们想在本地处理之后再把它传递到封闭块。比如,在异常发生的时候,我们可能需要回滚事务,然后在封闭块中写下错误日志。

要重新抛出异常,只要在本地处理程序中放置一个RAISE语句即可,示例如下:

DECLARE
??out_of_balance???EXCEPTION;
BEGIN
??...
??BEGIN???--?sub-block?begins
????...
????IF?...?THEN
??????RAISE?out_of_balance;???--?raise?the?exception
????END?IF;
??EXCEPTION
????WHEN?out_of_balance?THEN
??????--?handle?the?error
??????RAISE;???--?reraise?the?current?exception
??END;???--?sub-block?ends
EXCEPTION
??WHEN?out_of_balance?THEN
????--?handle?the?error?differently
????...
END;

如果在RAISE语句中省略了异常名称——只允许在异常处理程序中这样做——程序就会把当前的异常重新抛出。

热点排行