对于在执行存储过程当中碰到的一些错误,若是未及时捕获或者说传递给前端应用程序来,在这样的情形下,故障的排查显得尤其困难。基于此,咱们能够能够将这些错误信息记录到日志,同时也能够将其传递给前端应用程序。如本文的示例。前端
1.将错误信息记录到表
CREATE
TABLE ErrorLog
(
ID INT
IDENTITY (1,1) NOT
NULL,
ErrorNumber INT,
ErrorMessage VARCHAR(1000),
ErrorSeverity INT,
ErrorState INT,
ErrorLine INT,
ErrorProcedure VARCHAR(128),
ErrorDate datetime
);
CREATE
PROCEDURE
CatchErrorDemo AS
--相关业务逻辑
BEGIN
TRY
SELECT
1 / 0;
END
TRY
--相关错误捕获-
BEGIN
CATCH
PRINT
'Error Number:' +
CAST(ERROR_NUMBER() AS
VARCHAR(10));
PRINT
'Error Serverity: ' +
CAST(ERROR_SEVERITY() AS
VARCHAR(10));
PRINT
'Error State: ' +
CAST(ERROR_STATE() AS
VARCHAR(10));
PRINT
'Error Procedure: ' +
ERROR_PROCEDURE();
PRINT
'Error Line: ' + CAST(ERROR_LINE() AS
VARCHAR(10));
PRINT
'Error Message: ' +
ERROR_MESSAGE();
INSERT
INTO ErrorLog
(ErrorNumber, ErrorSeverity, ErrorState, ErrorProcedure, ErrorLine,
ErrorMessage, ErrorDate)
VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), GETDATE())
END
CATCH;
--执行相关存储过程,并查询日志表,同时与系统消息表进行对比
EXEC CatchErrorDemo;
SELECT *
FROM ErrorLog;
2.传递错误信息
CREATE
PROC CatchErrorDemo2 @a
INT, @rtn VARCHAR(20) OUTPUT, @rtn_message VARCHAR(200) OUTPUT
AS
BEGIN
BEGIN
TRY
DECLARE
@result INT;
SET
@result = 'A' + @a;
END
TRY
BEGIN
CATCH
SET @rtn
= @@ERROR;
SET
@rtn_message = 'Error Number:
' + CAST(ERROR_NUMBER() AS
VARCHAR(10)) + ' Error Serverity: ' +
CAST(ERROR_SEVERITY() AS
VARCHAR(10)) + ' Error State: ' +
CAST(ERROR_STATE() AS
VARCHAR(10)) + ' Error Procedure: ' +
ERROR_PROCEDURE() +
' Error Line: ' + CAST(ERROR_LINE() AS
VARCHAR(10)) + ' Error Message: ' + ERROR_MESSAGE();
END
CATCH;
END;
GO
--调用存储过程
DECLARE @rtn INT ,
@rtn_message VARCHAR(200);
EXEC CatchErrorDemo2
0, @rtn OUTPUT, @rtn_message OUTPUT;
PRINT @rtn;
PRINT @rtn_message;
245
Error Number:
245 Error Serverity:
16 Error State: 1 Error Procedure: CatchErrorDemo2
Error Line: 10
Error Message: 在将
varchar 值 'A' 转换成数据类型 int 时失败。