SQL Server 异常处理机制(Begin try Begin Catch)

SQL Server 异常处理机制(Begin try Begin Catch)

[sql] view plain copy
 
  1. begin try  
  2. --SQL   
  3. end try   
  4. begin catch   
  5. --sql (处理出错动作)  
  6. end catch  

我们将可能会出错的sql 写在begin try...end try 之间,若出错,刚程序就跳到紧接着的begin try...end try 的beign catch...end catch中,执行beign catch...end catch错误处理SQL。try..catch 是可以嵌套的。在begin catch ...end catch中我们可以利用系统提供的下面四个函数得到出错信息:
error_number 返回错误代码
error_serverity 返回错误的严重级别
error_state 返回错误状态代码
error_message 返回完整的错误信息
上面的四个函数在同一个begin catch ...end catch可以在多次使用,值是不变的。

下面是一个简单的小例子。

 

[sql] view plain copy
 
  1. begin try  
  2. select 2/0  
  3. end try  
  4. begin catch  
  5. select error_number() as error_number ,  
  6. error_message() as error_message,  
  7. error_state() as error_state,  
  8. error_severity() as error_severity  
  9. end catch  

结果:
-----
error_number error_message error_state error_severity
8134 遇到以零作除数错误。 1 16
-------------------------------------------------------
不受 TRY…CATCH 构造影响的错误 
TRY…CATCH 构造在下列情况下不捕获错误: 
严重级别为 10 或更低的警告或信息性消息。 
严重级别为 20 或更高且终止会话的 SQL Server 数据库引擎任务处理的错误。 如果所发生错误的严重级别为 20 或更高,而数据库连接未中断,则 TRY…CATCH 将处理该错误。 
需要关注的消息,如客户端中断请求或客户端连接中断。 
当系统管理员使用 KILL 语句终止会话时。

 

[sql] view plain copy
 
  1. USE AdventureWorks;  
  2. GO  
  3. BEGIN TRY  
  4.     -- Generate a divide-by-zero error.  
  5.     SELECT 1/0;  
  6. END TRY  
  7. BEGIN CATCH  
  8.     SELECT  
  9.         ERROR_NUMBER() AS ErrorNumber,  
  10.         ERROR_SEVERITY() AS ErrorSeverity,  
  11.         ERROR_STATE() AS ErrorState,  
  12.         ERROR_PROCEDURE() AS ErrorProcedure,  
  13.         ERROR_LINE() AS ErrorLine,  
  14.         ERROR_MESSAGE() AS ErrorMessage;  
  15. END CATCH;  
  16. GO   

[sql] view plain copy
 
  1. USE AdventureWorks;  
  2. GO  
  3. BEGIN TRANSACTION;  
  4.   
  5. BEGIN TRY  
  6.     -- Generate a constraint violation error.  
  7.     DELETE FROM Production.Product  
  8.         WHERE ProductID = 980;  
  9. END TRY  
  10. BEGIN CATCH  
  11.     SELECT   
  12.         ERROR_NUMBER() AS ErrorNumber,  
  13.         ERROR_SEVERITY() AS ErrorSeverity,  
  14.         ERROR_STATE() as ErrorState,  
  15.         ERROR_PROCEDURE() as ErrorProcedure,  
  16.         ERROR_LINE() as ErrorLine,  
  17.         ERROR_MESSAGE() as ErrorMessage;  
  18.   
  19.     IF @@TRANCOUNT > 0  
  20.         ROLLBACK TRANSACTION;  
  21. END CATCH;  
  22. IF @@TRANCOUNT > 0  
  23.     COMMIT TRANSACTION;  
  24. GO  

posted on 2018-06-05 11:51  高达  阅读(716)  评论(0)    收藏  举报

导航