这是基本的编程问题,而不是特定的SQL Server问题。我想知道错误处理的基本原则是什么?发生错误时,代码是否应该抛出异常?异常是否总是终止程序或批处理?
答案 0 :(得分:0)
如何处理错误通常取决于上下文。您可能会遇到某些错误。这种情况的一个例子可能是外围密钥违规。在这种情况下,您可能只希望记录错误(可能将其记录为信息而不是正确的错误)并向UI返回用户友好消息以通知用户发生了问题。其他错误是意外的。这些也应该被记录并报告给用户,并有可能进一步的步骤,以便将异常跟踪提供给开发团队(即通过电子邮件等)。
如今,许多现代编程语言都具有结构化异常处理功能,这使得异常捕获和记录异常非常简单。还有许多日志框架可以帮助记录日志。 .Net领域的良好日志框架包括log4net,nLog和elmah。对于所有这些日志框架,Web上应该有大量示例。
就SQL Server而言,错误处理功能不是那么先进。
处理存储过程中错误的常见模式类似于
create procedure [dbo].[test_dosomework]
(
@param1 int,
@param2 varchar(10)
)
as
begin
declare @errorCode int
select @errorCode = 0
insert table1 (aValue)
values (@param1)
select @errorCode = @@ERROR
if @errorCode = 0
begin
insert table1 (aValue2)
values (@param2)
select @errorCode = @@ERROR
end
return @errorCode
end
在这种情况下,如果在任何一个insert语句中发生错误,@ ERROR将返回错误号,@ errorCode将被设置为具有此错误号,并且存储过程的返回值将是错误号的返回值。
的返回值为0答案 1 :(得分:0)
如果您使用的是SQL 2005或2008,则应使用新的错误处理构造TRY/CATCH
,而不是在每个语句后检查@@error
。这是SQL 2000的做事方式,阅读和管理起来要困难得多。
您不必像已经讨论的那样捕获每个错误,因为批处理不会因某些错误而终止,但如果您想确保在几乎任何事情上中止事务,您应该使用SET XACT_ABORT ON
。批次的开头。
Erland Sommerskog在线查看任何涉及错误处理的内容。他是着名的SQL Server MVP,以错误处理为专业。