Oracle 异常详解(exception)

Oracle 异常详解(exception)

来源:(33条消息) Oracle 异常详解(exception)_鱼丸丶粗面-CSDN博客

鱼丸丶粗面 2018-10-08 23:03:23 2949 收藏 14
分类专栏: Oracle PL/SQL 文章标签: Oracle 异常 exception raise
版权

Oracle
同时被 2 个专栏收录
110 篇文章10 订阅
订阅专栏

PL/SQL
17 篇文章1 订阅
订阅专栏
文章目录
1 概述
1.1 思维导图
1.2 语法
2 异常分类
2.1 系统预定义
2.2 用户自定义
3 异常抛出
3.1 raise
3.2 raise_application_error
4 重写异常
1 概述
1. 概念
(1) 程序一旦发生异常而没有处理时,程序会 '自动终止'
(2) 反之,则跳转至 '最近一个 exception' 进行处理
1
2
3
1.1 思维导图


1.2 语法
1. 异常处理可以按任意次序排列,但 'others' 必须放在最后
2. 异常会被离它 '最近的一个 exception 块' 捕获到
(1) 若异常被 <异常1> 捕获到,那么该异常到此结束(不会继续判断 <异常2> 及其后面的)

如:
declare
begin
程序代码块;
exception
when <异常1> then
异常语句1;
when <异常2> then
异常语句2;
when others then
其它异常;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
例子:(除数不能为 0)

DECLARE
v_num NUMBER(5) := 5;
BEGIN
BEGIN
v_num := v_num / 0;
EXCEPTION
-- 如果此处无 exception,则抛向最近一个 exception
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE); -- 异常编号
dbms_output.put_line(SQLERRM); -- 异常描述信息
dbms_output.put_line(dbms_utility.format_error_backtrace); -- 异常发生的位置
dbms_output.put_line(dbms_utility.format_call_stack); -- 异常堆栈
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('若没有上面的 exception 代码块,异常才会被此处捕获');
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2 异常分类
1. 异常的两种分类
(1) 系统预定义:Oracle 自动抛出(如:'违反唯一性约束')
(2) 用户自定义:编码人员认为的 '非正常情况'

2. 其中 '用户自定义' 的异常在 pl/sql 环境使用,需 '显示抛出'
1
2
3
4
5
基础数据准备:

create table stu_info(
sno number(3) constraint pk_stu_info_sno primary key,
sname varchar2(30)
);
1
2
3
4
2.1 系统预定义
insert into stu_info(sno, sname) values(1, '瑶瑶');
insert into stu_info(sno, sname) values(1, '优优');
1
2
报错截图:(ORA-00001: 违反唯一约束条件)


2.2 用户自定义

declare
v_num number(5) := -1;
exp_data_range exception; -- 异常定义
begin
if v_num < 0 then
raise exp_data_range; -- 异常抛出
end if;
exception
when exp_data_range then
dbms_output.put_line('数据范围不能为负数!');
end;
1
2
3
4
5
6
7
8
9
10
11
测试结果:

数据范围不能为负数!
1
3 异常抛出
1. raise:异常抛出并在 pl/sql exception 块中处理

2. raise_application_error:异常抛出给 '应用程序',pl/sql 中并不处理!
1
2
3
3.1 raise
上述提到的就有:2.2 用户自定义
3.2 raise_application_error
raise_application_error(error_number, error_message, error_boolean);
error_number : 取值范围: -20000 到 -20999 之间
error_message :相应的提示信息(< 2048 字节),超出则截取。
error_boolean : 可选项,若为 true: 则新错误将被添加到已经引发的错误列表中。
若为 false(默认):则覆盖。
1
2
3
4
5
例1:false(默认,覆盖异常信息,若有)

declare
v_num number(5) := -1;
begin
if v_num < 0 then
raise_application_error(-20001, '不能为负数!'); -- 异常抛出
end if;
end;
1
2
3
4
5
6
7
异常抛出截图:


例2:true(追加异常信息)

declare
v_num number(5) := -1;
begin
begin
if v_num < 0 then
raise_application_error(-20001, '不能为负数!'); -- 异常抛出
end if;
exception
when others then
raise_application_error(-20001, 'true:追加异常信息', true); -- 异常抛出
end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
异常抛出截图:


4 重写异常
1. 异常均可被重写
(1) 系统预定义
(2) 用户自定义
1
2
3
示例:重写系统预定义异常:ORA-01476: 除数为 0

declare
exp_divisor_of_zero_rewrite exception;
pragma exception_init(exp_divisor_of_zero_rewrite, -1476);
v_num number(1) := 3;
begin
v_num := v_num / 0;
exception
when exp_divisor_of_zero_rewrite then
raise_application_error(-20001, '除数不能为 0(重写异常)');
end;
1
2
3
4
5
6
7
8
9
10
异常抛出截图:

————————————————
版权声明:本文为CSDN博主「鱼丸丶粗面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34745941/article/details/82846820

原文地址:https://www.cnblogs.com/shuihaya/p/15303845.html