因为项目需要,要用到oracle的存储过程。由于处理的业务比较复杂,难免中间哪个环节出错,所以觉得必须得加下异常处理。以下是最初的一个例子:
STEP1
create or replace procedure TestPro is
xh integer;
error_info exception;
begin
//业务代码
xh:=100;
EXCEPTION
WHEN error_info THEN
RAISE_APPLICATION_ERROR(-20010, '处理过程中出现错误');
end TestPro;
请大家不要见笑,以前真没用过ORACLE,用过ORALCE的人差不多一眼就能看到问题:异常处理不会执行。于是今天特意试了一下,怎么处理能行。
首先找到原因,没有触发"ERROR_INFO",接下来就拿它开刀:
STEP2
create or replace procedure TestPro is
xh integer;
error_info exception;
begin
//业务代码
xh:=100;
raise error_info;
EXCEPTION
WHEN error_info THEN
RAISE_APPLICATION_ERROR(-20010, '处理过程中出现错误');
end TestPro;
处理的还是有问题,黑猫白猫都逮着是不行的!于是有了下边的代码:
STEP3
create or replace procedure TestPro is
xh integer;
error_info exception;
begin
//业务代码
xh:=100
if xh<>100 then
raise error_info;
end if;
EXCEPTION
WHEN error_info THEN
RAISE_APPLICATION_ERROR(-20010, '处理过程中出现错误');
end TestPro;
以后对于业务中的处理可以采用这种方法,当每个条件不满足时可以以这种方式提示返回给调用者。真的是个不错的解决方法。
不过上面的代码貌似世界太平了,但是却是暗流涌动呀!如果有人这样:
xh:='aaaa'
又回到解放前了!而且这种错误用STEP2的代码是捕获不到的,因为你要处理前它已经发生了!但可以用这种方法:
create or replace procedure TestPro is
xh integer;
error_info exception;
begin
//业务代码
xh:=100
if xh<>100 then
raise error_info;
end if;
EXCEPTION
WHEN error_info THEN
RAISE_APPLICATION_ERROR(-20009, '处理过程中出现错误');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20010, '系统意外错误');
end TestPro;
一个OTHERS就搞定了!但切记不能滥用,最好还是把已知的错误分出来!