获取异常的具体出处dbms_utility.format_error_backtrace
来源:互联网 发布:程序员的呐喊 pdf 编辑:程序博客网 时间:2024/06/11 13:46
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 。
以下是正确使用这个函数的一些注意事项:
ü 在当前程序的异常处理模块中调用这个函数。
ü 避免在中间程序中使用异常处理模块。
调用这个过程的时候,会有ORA-00001异常抛出。
调用这个过程,捕捉OTHERS异常。
BEGIN
proc_insert;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE || ':' || SQLERRM);
dbms_output.put_line(dbms_utility.format_error_backtrace);
dbms_output.put_line(dbms_utility.format_error_stack);
END;
控制台输出:
-1:ORA-00001: unique constraint (SCOTT.SYS_C0012353) violated
ORA-06512: at "SCOTT.PROC_INSERT", line 2
ORA-06512: at line 2
ORA-00001: unique constraint (SCOTT.SYS_C0012353) violated
这样异常就能被正确地传输到最外层程序中,并打印出这个过程了。
注:此方法在oracle10g上起作用,对于9i目前还未找到类似的方法,哪位高手有方案,还望告知。谢谢。
- 获取异常的具体出处dbms_utility.format_error_backtrace
- PLSQL获取异常堆栈信息-dbms_utility.format_error_backtrace(正确抛出异常信息)
- dbms_utility获取CPU时间(get_cpu_time)
- dbms_utility.table_to_comma使用的注意点
- Oracle dbms_utility 几种返回的错误
- android源码编译(从很多地方搜索的,每个问题的具体出处搞不清楚了)
- 获取一个星期时间段的具体日期
- 获取指定年、月的具体天数
- android 通过经纬度获取具体的地理信息
- PHP获取当前url的具体方法
- 获取某值的具体某位
- 获取方法中泛型的具体类型
- 获取具体的泛型类型
- 获取报错的具体log
- 获取java参数化类中泛型的具体类型
- 获取一个view的具体宽高
- 获取元素的具体样式信息getcss
- 【转】用dbms_utility.get_time来估算过程的执行时间
- 如何发挥ERP系统中的财务监控职能?
- 【CSU 1258 维护序列】+ 线段树
- css 页面重绘和回流(重排)以及优化
- Kconfig
- python爬虫(17)爬出新高度_抓取微信公众号文章(selenium+phantomjs)(上)
- 获取异常的具体出处dbms_utility.format_error_backtrace
- Kotlin + anko
- "暗黑话题":如何给自己的私活项目标价
- php://input与php://output
- php定时计划任务实现方法
- Sql Server中的用户名和登录名
- php时间戳常用
- 欢迎使用CSDN-markdown编辑器
- Python+Selenium练习篇之26-执行JavaScript