zoukankan      html  css  js  c++  java
  • 获取异常的具体出处——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 。 


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

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

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

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

  • 相关阅读:
    OpenNESS & OpenVINO Demo 部署
    这种思路讲解数据仓库建模,你见过吗?数据人与架构师必看
    powerdesidgner1
    Java本地的项目,怎么可以让别人通过外网访问-内网穿透
    Java本地的项目,怎么可以让别人通过外网访问-内网穿透
    Java本地的项目,怎么可以让别人通过外网访问-内网穿透
    Java本地的项目,怎么可以让别人通过外网访问-内网穿透
    MySQL使用ProxySQL实现读写分离
    MySQL使用ProxySQL实现读写分离
    MySQL使用ProxySQL实现读写分离
  • 原文地址:https://www.cnblogs.com/Cqiang/p/3192336.html
Copyright © 2011-2022 走看看