我正在使用 C# 和一个链接到 SQL Server Express 数据库中的存储过程的类型化数据集。在存储过程中,我使用 try catch
进行错误处理。
这是我的捕获 block :
begin catch
select
error_number() as errorNumber,
error_severity() as errorSeverity,
error_state() as errorState,
error_procedure() as errorProcedure,
error_line() as errorLine,
error_message() as errorMessage
end catch
try catch
是处理数据库错误的最佳方式吗??由于 SQL Server 会将错误信息以表格的形式返回,我如何识别返回的表格是充满数据还是包含错误信息?
编辑: 好的,所以我得到异常并重新抛出它?但为什么?我的意思是,如果我一开始没有捕获它,它就会冒泡到我的应用程序中,我可以在那里进行管理。那我为什么要使用 try catch??
最佳答案
这可以是处理存储过程中错误的好方法,但通常您会这样做以将错误记录到表中:
begin catch
insert into ErrorLog
select
error_number() as errorNumber,
error_severity() as errorSeverity,
error_state() as errorState,
error_procedure() as errorProcedure,
error_line() as errorLine,
error_message() as errorMessage
end catch
但是,基于异常只应在特殊情况下发生的事实,您几乎肯定希望重新抛出错误,以便您的代码以最合理的方式处理此异常。
在 sql server 中,这是使用 RAISERROR
( docs ) 命令实现的。
您的代码最终会看起来像:
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- You could log the error here
INSERT INTO ErrorLog(message, severity, state)
VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)
-- Use RAISERROR inside the CATCH block to return error
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
关于c# - SQL Server 中的错误处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330333/