gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:52:36 25 4
gpt4 key购买 nike

这是对问题的跟进
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()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
--and do what exactly?
END CATCH
GO

无论如何,这是基本思想:每个 CATCH 块都很简单,工作在错误处理程序中进行。例如追加 ERROR_NUMBER()如果你想

关于sql-server-2005 - 报告错误时记录 SQL Server 调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2086973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com