常用异常处理方法 除了标准异常外,用户可以声明自己的已命名异常。比如商业规则错误,或者将自定义异常与一个数据库号相联系,甚至可以将数据库错误号赋予自定义异常。PL/SQL的这个性能极大的提高了对异常的管理和处理的能力。
声明自己的异常 如果你希望声明自己的异常,那么你可以在异常处理器中包括WHEN子句,声明的异常的作用范围与声明的变量相同。声明在外层块的异常能被该块和它的子块访问,但声明在子块的异常不能被父块处理。
例:
BEGIN DECLARE Insufficient_credite EXCEPTION; BEGIN RASISE Insufficient_credite; EXCEPTION WHEN Insufficient_credite THEN --可以在此处理异常 extend_credite(cust_id); END -嵌套块结束 EXCEPTION WHEN Insufficient_credite THEN --超出范围,不能在这里处理异常 END; |
如果声明的异常与内建的异常同名,那么当引用异常将解决你的异常而不是内建的异常。
给数据库错误命名 如果希望处理一个异常,那么异常必须有一个名字,数据库错误有数千个,但是只有不到25个是内建的已命名异常,但需要处理这些未命名的异常时,你可以将一个名字和一个错误号联系在一起,达到这个目的的语句是:PRAGMA EXCEPTION_INIT语句
语法如下:
PRAGMA EXCEPTION_INIT(exception_name,error_number);
执行这个语句之前,必须首先声明异常名。
DECLARE invald_table_name EXCEPTION; PRAGMA EXCEPTION_INIT(invald_table_name,-942); BEGIN
EXCEPTION WHEN invald_table_name THEN UTL_FILE.PUT_LINE(file_handle,'user' || UID || 'hit a bad table'); END; |
另外一种处理数据库错误的方法是使用内建函数SQLCODE和SQLERRM,这两个函数在包一级声明,SQLCODE将返回现行数据库错误号,这些错误号中除了NO_DATA_FOUND是+100外其他都是负数。SQLERRM返回文本描述的错误信息。为了获得用户自定义异常返回的SQLERRM和SQLCODE,你需要使用RAISE_APPLICATION_ERROR函数给自定义异常标注错误号。
给自定义错误标注号码 RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息。自定义异常的缺省错误号是+1,缺省信息是User_Defined_Exception。来自未处理的异常的一般信息对于识别导致错误的原因没有帮助,RAISE_APPLICATION_ERROR函数能够在pl/sql
程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常。
| RAISE_APPLICATION_ERROR(error_name,error_message[,{TRUE|| FALSE}]); |
错误号的范围是-20,999到-20,999。错误信息是文本字符串,最多为2048字节。TRUE和FALSE表示是添加(TRUE)进错误堆(ERROR STACK)还是覆盖(overwrite)错误堆(FALSE)。缺省情况下是FALSE。
IF product_not_found THEN RAISE_APPLICATION_ERROR(-20123,'Invald product code' TRUE); END IF;
|
