Sql server 错误处理的基本原则?

Sql server 错误处理的基本原则?,sql-server,sql-server-2008,programming-languages,error-handling,Sql Server,Sql Server 2008,Programming Languages,Error Handling,这是一个基本的编程问题,而不是一个特定的SQL Server问题。我想知道错误处理的基本原则是什么?发生错误时,代码是否应始终引发异常?异常是否应始终终止过程或批处理?处理错误的方式通常取决于上下文。您可能会遇到某些错误。这方面的一个例子可能类似于外国密钥冲突。在这种情况下,您可能只希望记录错误(可能将此记录为信息性错误,而不是正确的错误),并向UI返回一条用户友好的消息,通知用户发生了问题。其他错误是意外的。这些可能也应该被记录下来并报告给用户,并可能采取进一步的步骤向开发团队获取异常跟踪(即

这是一个基本的编程问题,而不是一个特定的SQL Server问题。我想知道错误处理的基本原则是什么?发生错误时,代码是否应始终引发异常?异常是否应始终终止过程或批处理?

处理错误的方式通常取决于上下文。您可能会遇到某些错误。这方面的一个例子可能类似于外国密钥冲突。在这种情况下,您可能只希望记录错误(可能将此记录为信息性错误,而不是正确的错误),并向UI返回一条用户友好的消息,通知用户发生了问题。其他错误是意外的。这些可能也应该被记录下来并报告给用户,并可能采取进一步的步骤向开发团队获取异常跟踪(即通过电子邮件等)

如今,许多现代编程语言都具有结构化的异常处理功能,这使得捕获和记录异常非常简单。还有许多日志框架可以帮助进行日志记录。.Net领域中的优秀日志框架包括log4net、nLog和elmah。对于所有这些日志框架,web上应该有大量的示例

就SQLServer而言,错误处理功能并没有那么先进

在存储过程中处理错误的常见模式如下

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将使用此错误号设置,存储过程的返回值将是错误号的返回值。如果您使用的是SQL 2005或2008,则返回值将为0,您应该使用新的错误处理构造
TRY/CATCH
,而不是在每条语句后检查
@@error
。这是SQL2000的工作方式,阅读和管理起来要困难得多

您不必像前面所讨论的那样捕获每个错误,因为批处理不会因某些错误而终止,但是如果您想确保在几乎任何事情上中止事务,您应该在批处理开始时使用
SET XACT_abort on


查看Erland Sommerskog online提供的任何涉及错误处理的内容。他是著名的SQL Server MVP,以错误处理为专长。

您是在谈论与数据库通信的错误吗?或者只是任何类型的错误?我将不得不尝试使用SQL Server 2008,但没有使用任何新功能。