任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
一、异常的种类及基本用法:
1、预定义异常(总计21种,具体见文档)
使用方法:
BEGIN
SELECT
...
SELECT
...
SELECT
...
...
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
...
常用类型:
NO_DATA_FOUND
--ORA-01403--
未找到行
TOO_MANY_ROWS
--ORA-01422--SELECT INTO
语句返回多行数据
VALUE_ERROR
--ORA-06502--
类型转换错误
ZERO_DIVIDE
--ORA-01476--
程序尝试除以
0
STORAGE_ERROR
--ORA-06500--PL/SQL
运行时内存溢出或内存不足
2、非预定义异常(EXCEPTION_INIT )
方法一: 需要在declare中申明,申明后使用即与预定义异常相同
declare
e_deptno_remaining
exception
;
PRAGMA
EXCEPTION_INIT
(e_deptno_remaining, -
2292
); begin ...
exception
when
e_deptno_remaining
then
dbms_output.put_line(
'
非预定义2292
'
);
when
others
then
dbms_output.put_line(
'others'
);
end
;
方法二: 错误号与错误信息均可自己定义 且无需在declare和exception中声明 declare i int := 5; begin if i=5then raise_application_error (-20086/*-20000——-20999*/, '自定义错误信息'); endif; end;
3、自定义异常(分为declare、raise、exception三部分) 使用示例: declare i int := 3; ex exception; begin if i <=2then raise ex; else dbms_output.put_line(i); endif; exception when ex then dbms_output.put_line('xxx'); end;
二、注意使用Others的异常类:
在EXCEPTION中定义任何的异常后 尽量都使用when others 表示遭遇到除此之外的任何异常如何处理
EXCEPTION WHEN exception_name1 THEN -- handler sequence_of_statements1 WHEN exception_name2 THEN -- another handler sequence_of_statements2 ... WHENOTHERSTHEN -- optional handler sequence_of_statements3 END; 另外,在EXCEPTION中可以使用OR链接 WHEN over_limit OR under_limit OR VALUE_ERROR THEN
三、使用系统错误号和错误信息
错误号----SQLCODE; 错误信息--SQLERRM; DECLARE err_num NUMBER; err_msg VARCHAR2(100); BEGIN ... EXCEPTION WHENOTHERSTHEN err_num := SQLCODE; err_msg := SUBSTR(SQLERRM, 1, 100); dbms_output.put_line(err_num || '---' || err_msg); END;
四、异常传播的规则 首先,异常是会向他的外层进行传递的 即如果在当前子块中未定义异常处理,则会传递到外层的异常处理 直到异常被捕获或最终被抛弃
注:声明中的异常必定无法被当前块捕获 DECLARE Abc number(3):='abc'; ... BEGIN ... EXCEPTION WHENOTHERSTHEN ... END;----即便使用others最终也无法捕获
|
|
来自: tbinspiration > 《oracle》