获取PL / SQL中重新抛出的异常的完整堆栈跟踪(来自发起的点异常)

时间:2017-07-18 17:29:12

标签: oracle plsql

我在PL/SQL中有几个嵌套块,如果出现错误,我想通过在每个嵌套级别的路上重新抛出错误来处理最高级别的错误。每当我在内部块中重新抛出(RAISE)异常的问题时,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE会将堆栈重置为该点,其中异常是最后一次引发的(这是前往顶部的嵌套块之一)水平)。我找不到从最初发生异常的地方获得完整堆栈跟踪的方法。任何想法如何获得完整的堆栈跟踪,除了在重新抛出中间块之前记录?

2 个答案:

答案 0 :(得分:1)

我看到你要做的事情,我同意ivanzg不需要这样做 - 在顶级处理程序中,你可以将整个被调用堆栈追溯到程序和错误行。

RAISE声明是您正在做的事情的杀手。一旦你这样做,你就失去了真正的错误位置。

答案 1 :(得分:0)

实际上,要获取完整的调用堆栈,请使用DBMS_UTILITY.FORMAT_CALL_STACK()和DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()的组合。 FORMAT_CALL_STACK将向错误处理程序显示顶级调用,FORMAT_ERROR_BACKTRACE将从错误处理程序(准确地)显示错误过程和代码行。

FORMAT_CALL_STACK唯一的缺点是行号不一定是您所期望的 - 它们指向错误处理程序。