Oracle 异常详解(exception)

1 概述

1.1 思维导图

在这里插入图片描述

1.2 语法

declare
begin
  程序代码块;
exception
  when <异常1> then
    异常语句1;
  when <异常2> then
    异常语句2;
  when others then
    其它异常;
end;

-- 说明
1. 异常处理可以按任意次序排列,'others' 必须放在最后
2. 异常会被离它 '最近一个 exception 中的 最近一个 when' 捕获到,异常结束

例子:(除数不能为 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;

2 异常分类

1. 异常的两种分类
   (1) 系统预定义:Oracle 自动抛出(如:'违反唯一性约束'(2) 用户自定义:编码人员认为的 '非正常情况'

2. 其中 '用户自定义' 的异常在 pl/sql 环境使用,需 '显示抛出'

基础数据准备:

create table stu_info (
  sno   number(3) constraint pk_stu_info_sno primary key,
  sname varchar2(30)
);

2.1 系统预定义

insert into stu_info(sno, sname) values(1, '瑶瑶');
insert into stu_info(sno, sname) values(1, '优优');

报错截图:(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;

测试结果:

数据范围不能为负数!

3 异常抛出

1. raise:异常抛出并在 pl/sql exception 块中处理

2. raise_application_error:异常抛出给 '应用程序',pl/sql 中并不处理!

3.1 raise

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:false(默认,覆盖异常信息,若有)

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

异常抛出截图:
在这里插入图片描述

例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;

异常抛出截图:
在这里插入图片描述

4 重写异常

异常均可被重写
(1) 系统预定义
(2) 用户自定义

示例:重写系统预定义异常: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;

异常抛出截图:
在这里插入图片描述

  • 19
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值