• 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

  • 相关阅读:
    【More Effective C++ 条款4】非必要不提供default constructor
    【More Effective C++ 条款3】最好不要以多态方式处理数组
    【C++】Debug模式和Release模式的区别
    【More Effective C++ 条款2】最好使用C++转型操作符
    【More Effective C++ 条款1】仔细区别pointers和references
    程序崩溃时的堆栈捕捉
    快速排序--来自维基百科
    十六进制转为字符串
    linux那些事
    svnsync备份
  • 原文地址:https://www.cnblogs.com/shuihaya/p/15303845.html
Copyright © 2020-2023  润新知