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

系统 1856 0

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.      BEGIN   TRANSACTION   --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.              ROLLBACK   TRANSACTION   --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.                  ROLLBACK   TRANSACTION   --RollBack Transaction if Error..   
  40.   
  41.                  RETURN   
  42.   
  43.              END   
  44.   
  45.              ELSE   
  46.   
  47.              BEGIN   
  48.   
  49.                  COMMIT   TRANSACTION   --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.          BEGIN   TRANSACTION   -- 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  

 

 

ref: http://www.it118.org/Specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/4444b6c8-6dae-4c65-8d6d-beb334aee3e3.htm  

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论