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

前端之家收集整理的这篇文章主要介绍了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块中的存储过程或函数调用中使用它们

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

  1. ...
  2. END TRY
  3. BEGIN CATCH
  4. IF XACT_STATE() <> 0 AND @starttrancount = 0
  5. ROLLBACK TRANSACTION
  6. EXEC dbo.MyExceptionHandler @@PROCID,@errmsg OUTPUT;
  7. RAISERROR (@errmsg,16,1);
  8. END CATCH
  9.  
  10. ---with this handler (cut down version of ours)
  11. CREATE PROCEDURE dbo.MyExceptionHandler
  12. @CallerProcID int,@ErrorMessage varchar(2000) OUTPUT
  13. WITH EXECUTE AS OWNER --may be needed to get around Metadata visibility issues of OBJECT_NAME
  14. AS
  15. SET NOCOUNT,XACT_ABORT ON;
  16.  
  17. BEGIN TRY
  18. SET @ErrorMessage = --cutdown
  19. CASE
  20. WHEN @errproc = @callerproc THEN --Caller = error generator
  21. --build up stuff
  22.  
  23. ELSE --Just append stuff --Nested error stack
  24. END;
  25.  
  26. IF @@TRANCOUNT = 0
  27. INSERT dbo.Exception (Who,TheError,WhatBy,LoggedBy)
  28. VALUES (ORIGINAL_LOGIN()),RTRIM(ERROR_MESSAGE()),OBJECT_NAME(@CallerProcID));
  29. END TRY
  30. BEGIN CATCH
  31. --and do what exactly?
  32. END CATCH
  33. GO

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

猜你在找的MsSQL相关文章