语句执行过程中,可能会因为异常造成损失,甚至是系统崩溃。为了避免这种情况的发生,必须对异常进行处理。PL/SQL提供了对异常进行处理的方法。该方法会使得在PL/SQL代码部分执行的过程中无论何时发生了异常错误,都会自动转向执行异常处理部分。
1、预定义异常
预定义异常是由系统产生的。比如在出现0为除数的时候,系统会产生一个预定义的ZERO_DIVIDE异常。示例如下:
declare num1 number := 2; num2 number := 0; num3 number; begin num3 := num1/num2; --当执行这句的时候,系统捕捉到异常会自动转到异常处理部分,最后输出“不能除0”。 exception when zero_divide then dbms_output.put_line('不能除0'); when too_many_rows then dbms_output.put_line('too many rows'); end;
如果在当前块中没有处理异常的代码,并且begin/end块是嵌套的,程序将继续在外部块中寻找处理异常的代码块,直到找到一个。如果最终没有处理异常的代码块存在,程序将结束。当对异常进行了处理后,程序将继续执行异常代码块之后的代码。
2、自定义异常
用户如果需要自定义异常的话,可以先定义一个exception变量,然后使用raise语句来抛出一个异常,然后在捕捉异常的时候捕捉对应的抛出异常。示例代码如下:
declare selfDefineException exception; /*定义异常变量*/ num1 number := 2; num2 number := 3; num3 number; begin num3 := num1 + num2; if num3=5 then raise selfDefineException; /*抛出自定义的异常*/ end if; exception when selfDefineException then /*捕获自定义的异常*/ dbms_output.put_line("selfDefineException"); when zero_divide then dbms_output.put_line("不能除0"); end;
3、使用others异常
对于那些没有直接捕捉的异常,都可以使用others异常进行捕捉,others异常可以单独使用,但当与其他异常处理一起使用的时候必须放在所有情况的最末尾。示例代码如下:
declare num1 number := 2; num2 number := 0; num3 number; begin num3 := num1/num2; --当执行这句的时候,系统捕捉到异常会自动转到异常处理部分,最后输出“不能除0”。 exception when others then /*这里直接捕捉others异常*/ dbms_output.put_line('不能除0'); end;