我正在try..catch
中调用一个遗留存储过程。当存储过程以简单的语言向用户返回一条包含错误详细信息的消息时,我的try..catch
无法检测到它
从遗留存储过程返回的消息如下:
错误状态:1,错误严重性:16,错误编号:50000错误行:33,错误程序:LegacyStoredProcedure
错误消息:请注意。。。。正在回滚事务。
是否有方法检测存储过程中返回的消息?
BEGIN TRY
BEGIN Transaction
.....
EXEC *thelegacySP*
.....
COMMIT Transaction
END TRY
BEGIN CATCH
DECLARE
@ErrorLine int,
@ErrorMessage nvarchar(2048),
@ErrorNumber int,
@ErrorProcedure nvarchar(126),
@ErrorSeverity int,
@ErrorState int;
SELECT @ErrorLine = ERROR_LINE(),
@ErrorMessage = ERROR_MESSAGE(),
@ErrorNumber = ERROR_NUMBER(),
@ErrorProcedure = '*MyNewSP*',
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@now = GETDATE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
INSERT INTO Validation.Table
VALUES(
@ErrorProcedure
,@ErrorNumber
,@ErrorMessage
,@ErrorSeverity
,@ErrorState
,@ErrorLine
,@now
)
END CATCH
实现错误处理的最佳方法是使用THROW;
重新引发原始错误
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRAN;
.....
EXEC *thelegacySP*
.....
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
INSERT INTO Validation.Table (
ErrorProcedure
,ErrorNumber
,ErrorMessage
,ErrorSeverity
,ErrorState
,ErrorLine
,Date)
VALUES (ERROR_LINE(),
ERROR_MESSAGE(),
ERROR_NUMBER(),
'*MyNewSP*',
ERROR_SEVERITY(),
ERROR_STATE(),
GETDATE());
THROW;
END CATCH;
请注意,只有当您想要记录错误时,才需要此代码。
如果您不想记录错误,则根本不应该使用TRY/CATCH
。您只需要SET XACT_ABORT ON;
即可确保自动回滚
SET XACT_ABORT ON;
BEGIN TRAN;
.....
EXEC *thelegacySP*
.....
COMMIT;
你可能会发现Erland Sommarskog的文章虽然很长,但内容丰富。