微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server-2005 – 报告错误时记录SQL Server调用堆栈

这是问题的后续行动
Nested stored procedures containing TRY CATCH ROLLBACK pattern?

在catch块中,我使用存储过程通过读取ERROR_MESSAGE(),ERROR_PROCEDURE(),ERROR_LINE()等来报告(重新加载)错误.如here所述,我还有一个检查,以便它可以确定错误是否有已经被重新抛出(这种情况发生在嵌套的存储过程中,因为错误信息通过每个TRY CATCH块向下传递).

我想做的是,直接在’ReportError’中,或者间接在我的模式中(如第一个问题中所述),记录一个堆栈跟踪 – 所以当ReportError检测到它正在接收自己抛出的错误时,它会追加堆栈的下一级到错误消息.这将帮助我避免我看到来自某个小实用程序存储过程的错误消息的情况,而无需知道什么叫它.如果我尝试直接在ReportError中执行此操作,则会失败,因为重新抛出错误会将自身报告为来自ReportError – 只有原始错误可见.

ReportError是否有一些方法可以在sql Server中执行堆栈跟踪,而无需将参数传递给每个存储过程,也无需使用#temp表手动维护这样的跟踪?基本上我想要一个ERROR_PROCEDURE()和ERROR_LINE()的递归调用.

解决方法

好的,我将把我们的错误处理添加回来:-)

ERROR _%()函数对CATCH块的作用域可见.这意味着您可以在每个CATCH块中的存储过程或函数调用中使用它们

使用嵌套的存储过程,了解导致错误的原因以及记录错误内容非常有用

...
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    EXEC dbo.MyExceptionHandler @@PROCID,@errmsg OUTPUT;
    RAISERROR (@errmsg,16,1);
END CATCH

---with this handler (cut down version of ours)
CREATE PROCEDURE dbo.MyExceptionHandler
    @CallerProcID int,@ErrorMessage varchar(2000) OUTPUT
WITH EXECUTE AS OWNER --may be needed to get around Metadata visibility issues of OBJECT_NAME
AS
SET NOCOUNT,XACT_ABORT ON;

BEGIN TRY
    SET @ErrorMessage = --cutdown
            CASE
                WHEN @errproc = @callerproc THEN        --Caller = error generator
                        --build up stuff

                ELSE    --Just append stuff             --nested error stack
            END;

    IF @@TRANCOUNT = 0
        INSERT dbo.Exception (Who,TheError,WhatBy,LoggedBy)
        VALUES (ORIGINAL_LOGIN()),RTRIM(ERROR_MESSAGE()),OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
   --and do what exactly?
END CATCH
GO

无论如何,这是基本的想法:每个CATCH块都很简单,工作在错误处理程序中继续进行.例如,如果您愿意,请附加ERROR_NUMBER()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐