65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server 中的异常处理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (16投票s)

2009 年 7 月 17 日

CPOL

2分钟阅读

viewsIcon

142857

如何有效处理 SQL Server 中的错误?

引言

SQL Server 中处理错误变得更加容易,这得益于多种不同的方法。SQL Server 2005 引入了一种新的选项,可以有效地处理错误。有时我们无法捕获最终用户处发生的错误。即使我们想知道最终用户处发生的错误,我们也需要编写代码将其发送给我们。这会给服务器带来额外的开销。

SQL Server 2005 引入了 TRY...CATCH 语句,这有助于我们在后端有效地处理错误。这种异常处理可以提供有关错误的更多信息。

TRY...CATCH

TRY...CATCH 语句的工作方式与编程语言中的类似。它首先执行我们在 TRY 块中编写的 SQL 语句,如果发生任何错误,则执行 CATCH 块。

BEGIN TRY
// SQL Statements
END TRY
BEGIN CATCH
//Handle the exception details
END CATCH

有许多错误处理属性语句,如下所示

 ERROR_NUMBER()  
 ERROR_STATE()  
 ERROR_SEVERITY()  
 ERROR_LINE()  
 ERROR_PROCEDURE()  
 ERROR_MESSAGE()   

通常,SQL Server 将执行过程中发生的默认错误消息存储在以下系统表中

select * from sys.messages

但是,我们可以借助这种异常处理创建自己的错误消息详细信息。

使用 TRY...CATCH 处理异常

下面的示例展示了在 Northwind 数据库中 TRY...CATCH 异常处理技术的实际应用。

USE [NorthWind]
GO

IF OBJECT_ID('dbo.ErrorTracer') IS NOT NULL
BEGIN
	DROP TABLE dbo.ErrorTracer
	PRINT 'Table dbo.ErrorTracer Dropped'
END
GO

CREATE TABLE ErrorTracer
(
  iErrorID INT PRIMARY KEY IDENTITY(1,1),
  vErrorNumber INT,
  vErrorState INT,
  vErrorSeverity INT,
  vErrorLine INT,
  vErrorProc VARCHAR(MAX),
  vErrorMsg VARCHAR(MAX),
  vUserName VARCHAR(MAX),
  vHostName VARCHAR(MAX),
  dErrorDate DATETIME DEFAULT GETDATE()
)

IF OBJECT_ID('dbo.ErrorTracer') IS NOT NULL
BEGIN
	PRINT 'Table dbo.ErrorTracer Created'
END
GO

IF OBJECT_ID('Proc_InsertErrorDetails') IS NOT NULL
BEGIN
	DROP PROCEDURE [dbo].[Proc_InsertErrorDetails]
    PRINT 'Procedure Proc_InsertErrorDetails Dropped'
END
GO

CREATE PROCEDURE Proc_InsertErrorDetails
AS
/*
Purpose    : Insert the error details occurred in the SQL query
Input      : Insert the details which receives from the TRY...CATCH block
Output     : Insert the details of received errors into the ErrorTracer table
Created By : Senthilkumar
Created On : July 17, 2009
*/
BEGIN
  SET NOCOUNT ON 
  SET XACT_ABORT ON
  
  DECLARE @ErrorNumber VARCHAR(MAX)  
  DECLARE @ErrorState VARCHAR(MAX)  
  DECLARE @ErrorSeverity VARCHAR(MAX)  
  DECLARE @ErrorLine VARCHAR(MAX)  
  DECLARE @ErrorProc VARCHAR(MAX)  
  DECLARE @ErrorMesg VARCHAR(MAX)  
  DECLARE @vUserName VARCHAR(MAX)  
  DECLARE @vHostName VARCHAR(MAX) 

  SELECT  @ErrorNumber = ERROR_NUMBER()  
       ,@ErrorState = ERROR_STATE()  
       ,@ErrorSeverity = ERROR_SEVERITY()  
       ,@ErrorLine = ERROR_LINE()  
       ,@ErrorProc = ERROR_PROCEDURE()  
       ,@ErrorMesg = ERROR_MESSAGE()  
       ,@vUserName = SUSER_SNAME()  
       ,@vHostName = Host_NAME()  
  
INSERT INTO ErrorTracer(vErrorNumber,vErrorState,vErrorSeverity,vErrorLine,_
	vErrorProc,vErrorMsg,vUserName,vHostName,dErrorDate)  
VALUES(@ErrorNumber,@ErrorState,@ErrorSeverity,@ErrorLine,@ErrorProc,_
	@ErrorMesg,@vUserName,@vHostName,GETDATE())  
END

IF OBJECT_ID('Proc_InsertErrorDetails') IS NOT NULL
BEGIN
    PRINT 'Procedure Proc_InsertErrorDetails Created'
END
GO

IF OBJECT_ID('Proc_ExceptionHandlingExample') IS NOT NULL
BEGIN
	DROP PROCEDURE [dbo].[Proc_ExceptionHandlingExample]
    PRINT 'Procedure Proc_ExceptionHandlingExample Dropped'
END
GO

CREATE PROCEDURE Proc_ExceptionHandlingExample
AS
BEGIN
/*
Purpose    : Sample procedure for check the Try...Catch
Output     : It will insert into ErrorTracer table if this 
			stored procedure throws any error
Created By : Senthilkumar
Created On : July 17, 2009
*/
   SET NOCOUNT ON
   SET XACT_ABORT ON
   
   BEGIN TRY
      SELECT 15/0
   END TRY
   BEGIN CATCH
      EXEC Proc_InsertErrorDetails
   END CATCH
END

IF OBJECT_ID('Proc_ExceptionHandlingExample') IS NOT NULL
BEGIN
    PRINT 'Procedure Proc_ExceptionHandlingExample Created'
END
GO

EXEC Proc_ExceptionHandlingExample

SELECT * FROM ErrorTracer

步骤

步骤 1:创建名为“ErrorTracer”的自定义错误表。

步骤 2:编写用于处理当前异常的通用存储过程,名为 Proc_InsertErrorDetails ,它将帮助我们将错误详细信息插入到 步骤 1 中创建的表中。

步骤 3:编写一个示例过程,并使用 TRY...CATCH 语句执行异常处理。每当发生错误时,它将调用 Proc_InsertErrorDetails ,然后将插入错误详细信息。

步骤 4:现在,检查 ErrorTracer 表,它将列出捕获的错误详细信息。

结论

这种定制的错误处理技术有助于我们有效地改进后端错误详细信息。我们已经在表中提供了日期和用户名详细信息,这将帮助您根据日期和用户名分别查找错误详细信息。

历史

  • 2009 年 7 月 17 日:初始发布
© . All rights reserved.