zoukankan      html  css  js  c++  java
  • 获取异常的具体出处dbms_utility.format_error_backtrace

    EXCEPTION
    WHEN OTHERS THEN
    p_errno := -1;
    p_errmsg :=SQLCODE || ':' || SQLERRM || substr(dbms_utility.format_error_backtrace, 1, 100);
    ROLLBACK;
    INSERT INTO log_operation
    (log_id, log_time, operator_id, success_flag, description, operation_type_code)
    VALUES
    (seq_log.NEXTVAL, SYSDATE, p_operator_id, 0, p_errmsg, 1);
    COMMIT;
    END;

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 

    返回当前异常相应的描述,没有字符长度限制。与 SQLCODE 相同的是,必须在异常处理模块中使用。虽然名称中有一个 stack 在,但通过它并不能知道异常的最初生成处,需要的话就必须使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 。 


    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 

    系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个函数使用这个栈,然后返回该异常的整个传递过程。这个函数对错误的定位和实施下一步处理起着至关重要的作用。 

    Create or replace procedure procl is 

    Begin 

    Dbms_output.put_line(‘running proc1’); 

    Raise no_data_found; 

    End; 

    create or replace procedure proc2 is 

    begin 

    dbms_output.put_line(‘calling proc1’); 

    proc1; 

    end; 

    create or replace procedure proc3 is 

    begin 

    dbms_output.put_line(‘calling proc2’); 

    proc2; 

    exception 

    when no_data_found 

    then 

    dbms_output.put_line(‘error stack at top level’); 

    dbms_output.put_line(dbms_utility.format_error_backtrace); 

    end; 

    现在可以运行 proc3 来看看结果。 

    Sql>set serveroutput on; 

    Sql>begin 

    2 dbms_output.put_line(‘proc3->proc2->proc1 backtrace’); 

    3 proc3; 

    4 end; 

    5 / 

    Proc3 -> Proc2 -> Proc1 backtrace 

    calling proc2 

    calling proc1 

    running proc1 

    Error stack at top level: 

    ORA-06512: at "SCOTT.PROC1", line 4 

    ORA-06512: at "SCOTT.PROC2", line 5 

    ORA-06512: at "SCOTT.PROC3", line 4 

    事实上,每次异常的产生都将重置这个异常栈,只是最后一次从系统栈出栈的是最外层的程序块,所以可以清楚地看到异常生成的整个过程。上面这个程序的执行过程是这样的:首先用 put_line 打印 Proc3 -> Proc2 -> Proc1 backtrace , 调用 proc3 ,当前程序入栈 => 打印 calling proc2 ,调用 proc2 , proc3 入栈 => 打印 calling proc1 ,调用 proc1 , proc2 入栈 => 打印 running proc1 ,生成 no_data_found 异常,该异常被压入异常栈中 => proc2 出栈,并检测到来自第 5 行调用传递过来的异常,将它在此压入异常栈 => proc3 出栈,并检测到来自第 4 行调用传递过来的异常,将它在此压入异常栈, dbms_utility.format_error_backtrace 将异常栈中信息反相打印出来 => 最外层程序出栈, end 。

    以下是正确使用这个函数的一些注意事项: 

    ü 在当前程序的异常处理模块中调用这个函数。 

    ü 避免在中间程序中使用异常处理模块。 

    这样异常就能被正确地传输到最外层程序中,并打印出这个过程了。


    注:此方法在oracle10g上起作用,对于9i目前还未找到类似的方法,哪位高手有方案,还望告知。谢谢。

  • 相关阅读:
    DataTable Clone()方法和Copy()方法的区别
    element-ui的使用
    解决VS Code 软件PowerShell执行策略问题
    Vue-Router
    Vue的生命周期
    vue-cli脚手架和webpack
    Vue组件
    Vue基本用法和指令
    ES6常用语法
    前端-Bootstrap框架
  • 原文地址:https://www.cnblogs.com/advocate/p/1722837.html
Copyright © 2011-2022 走看看