目录
异常处理
【导言】抛异常是为了运行的时候不报错,并提示这段代码运行的结果有问题,让开发者针对这个异常做特定处理(写代码)。
1、预定义异常
【通用结构】
exception
when 系统已经定义好的异常 then 出现异常的处理方法;
【导言】如果我们查询的数据是表中不存在的,那么运行后,就会直接报错,停止运行。
declare
v_sname student.sname%type; --也可以v_sname varchar(10);这样定义
begin
select sname into v_sname from student where sno='0000000000';
end;
【例题】查询学号为'0000000000'的学生姓名,如果没有这个学生则抛出异常,输出“没有查询到数据”。
【输出】没有查询到数据
declare
v_sname student.sname%type; --也可以v_sname varchar(10);这样定义
begin
select sname into v_sname from student where sno='0000000000';
exception
when no_data_found then dbms_output.put_line('没有查询到数据');
end;
【解析】由于"no_data_found'是系统已经定义好的异常(错误代码大全),他有错误原因:查不到数值,错误代码ORA-01403,也有定义好的名字“not_data_found”。故可以直接用。
2、非预定义异常
【通用结构】非预定义异常
declare
异常名 exception;
begin
pragma exception_init(我们起的名字,错误代码) ;
exception
when 系统已经定义好的异常 then 出现异常的处理方法;
end;
【导言】在上面那个例子中,我们知道,错误原因:没有数据。他有错误代码(ORA-01403)和错误名字“not_data_found”。
但是错误原因(错误代码)那么多,不可能每一个错误都有类似“no_data_found”这样的名字的,所以有时候需要利用非预定义异常,我们亲自为系统能识别到的错误(有错误代码的)起个名字。
假如插入一行已经存在的数据,会显示:
declare
begin
insert into score values('11111','A001',76);
end;
他有错误代码,却没有名字,所以需要我们使用非预定义异常,为这个错误代码起个名字。
【例题】插入一条数据(假设我们不知道这个数据表中已经存在)【输出:该条记录已存在】
declare
e_exist exception;
pragma exception_init(e_exist,-02291);
begin
insert into score values('11111','A001',76);
exception
when e_exist then dbms_output.put_line('该条记录已存在');
end;
3、自定义异常
【通用结构】自定义异常
declare
异常名 exception;(定义异常)
begin
raise 异常名 (触发异常)
exception
when 系统已经定义好的异常 then 出现异常的处理方法;(解决异常)
end;
【导言】 我们觉得哪种结果是“异常”的,就能定义。比如让程序从0开始,循环输出人类最大的岁数,对于计算机而言,循环到上百万都没问题,这对计算机而言不是异常,但实际上哪有人类能活这么久,所以我们就能将超过100的数,当作异常。
【例题】用户自定义异常,求1+2+3....+100的值,在求和的过程中如果发现结果超出1000,则抛出异常,并停止求和。
declare
err_outrange exception;
s int:=0;
begin
for i in 1..100
loop
s:=s+i;
if s>1000 then --触发异常的条件
raise err_outrange; --raise,触发异常
end if;
end loop;
dbms_output.put_line(s);
exception
when err_outrange then dbms_output.put_line('超出范围,停止计算');
end;
【输出】超出范围,停止计算