使用TRY CATCH进行SQL Server异常处理

TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.

    *      TRY 块 - 包含可能产生异常的代码或脚本
    *      CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等.
Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处.

SQL SERVER 2000中异常处理:

  1. CREATE PROC usp_AccountTransaction 
  2.  
  3.     @AccountNum INT
  4.  
  5.     @Amount DECIMAL 
  6.  
  7. AS 
  8.  
  9. BEGIN 
  10.  
  11.     BEGINTRANSACTION--beginning a transaction.. 
  12.  
  13.         UPDATE MyChecking SET Amount = Amount - @Amount 
  14.  
  15.             WHERE AccountNum = @AccountNum 
  16.  
  17.         IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
  18.  
  19.         BEGIN 
  20.  
  21.             ROLLBACKTRANSACTION--RollBack Transaction if Error.. 
  22.  
  23.             RETURN 
  24.  
  25.         END 
  26.  
  27.         ELSE 
  28.  
  29.         BEGIN 
  30.  
  31.             UPDATE MySavings SET Amount = Amount + @Amount 
  32.  
  33.                 WHERE AccountNum = @AccountNum 
  34.  
  35.             IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
  36.  
  37.             BEGIN 
  38.  
  39.                 ROLLBACKTRANSACTION--RollBack Transaction if Error.. 
  40.  
  41.                 RETURN 
  42.  
  43.             END 
  44.  
  45.             ELSE 
  46.  
  47.             BEGIN 
  48.  
  49.                 COMMITTRANSACTION--finally, Commit the transaction if Success.. 
  50.  
  51.                 RETURN 
  52.  
  53.             END 
  54.  
  55.         END 
  56.  
  57. END 
  58.  
  59. GO 

上面是Sql server 2000的一个存储过程,在每个数据库操作之后立即必须检查@@ERROR,进行Commit / RollBack该事务.
Sql server 2000中监测错误,只能通过监测全局遍历 @@ERROR.由于@@ERROR会被下一个数据库操作所覆盖. 所以在每次操作完后必须立即监测.

SQL SERVER 2005中异常处理:

TRY...CATCH是SQL Server 2005提供的更具有可读性的语法.每个开发人员都熟悉这种写法.SQL Server 2005仍然支持@@ERROR这种用法.

1.try catch语法:

  1.   BEGIN TRY 
  2.  
  3.     Try Statement 1 
  4.  
  5.     Try Statement 2 
  6.  
  7.     ... 
  8.  
  9.     Try Statement M 
  10.  
  11. END TRY 
  12.  
  13. BEGIN CATCH 
  14.  
  15.     Catch Statement 1 
  16.  
  17.     Catch Statement 2 
  18.  
  19.     ... 
  20.  
  21.     Catch Statement N 
  22.  
  23. END CATCH 

 

2.获得错误信息的函数表:

 

下面系统函数在CATCH块有效.可以用来得到更多的错误信息:

函数描述
ERROR_NUMBER() 返回导致运行 CATCH 块的错误消息的错误号。
ERROR_SEVERITY() 返回导致 CATCH 块运行的错误消息的严重级别
ERROR_STATE() 返回导致 CATCH 块运行的错误消息的状态号
ERROR_PROCEDURE() 返回出现错误的存储过程名称
ERROR_LINE() 返回发生错误的行号
ERROR_MESSAGE() 返回导致 CATCH 块运行的错误消息的完整文本


简单示例:

  1. BEGIN TRY 
  2.  
  3.     SELECT GETDATE() 
  4.  
  5.     SELECT 1/0--Evergreen divide by zero example! 
  6.  
  7. END TRY 
  8.  
  9. BEGIN CATCH 
  10.  
  11.     SELECT'There was an error! ' + ERROR_MESSAGE() 
  12.  
  13.     RETURN 
  14.  
  15. END CATCH; 

3.try catch回滚/提交事务的示例

  1. ALTER PROC usp_AccountTransaction 
  2.  
  3.     @AccountNum INT
  4.  
  5.     @Amount DECIMAL 
  6.  
  7. AS 
  8.  
  9. BEGIN 
  10.  
  11.     BEGIN TRY --Start the Try Block.. 
  12.  
  13.         BEGINTRANSACTION-- Start the transaction.. 
  14.  
  15.             UPDATE MyChecking SET Amount = Amount - @Amount 
  16.  
  17.                 WHERE AccountNum = @AccountNum 
  18.  
  19.             UPDATE MySavings SET Amount = Amount + @Amount 
  20.  
  21.                 WHERE AccountNum = @AccountNum 
  22.  
  23.         COMMIT TRAN -- Transaction Success! 
  24.  
  25.     END TRY 
  26.  
  27.     BEGIN CATCH 
  28.  
  29.         IF @@TRANCOUNT > 0 
  30.  
  31.             ROLLBACK TRAN --RollBack in case of Error 
  32.  
  33.         -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception 
  34.  
  35.         RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1) 
  36.  
  37.     END CATCH 
  38.  
  39. END 
  40.  
  41. GO 
posted @ 2013-08-13 21:40  残韵  阅读(1240)  评论(0编辑  收藏  举报