之乎者也,阿弥陀佛

软件设计的原则就是,化繁为简,化难为易,把人的思维集中在简单的领域,然后通过有序的组合实现复杂的逻辑。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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. @AccountNum INT,
  3. @Amount DECIMAL
  4. AS
  5. BEGIN
  6. BEGIN TRANSACTION --beginning a transaction..
  7. UPDATE MyChecking SET Amount = Amount - @Amount
  8. WHERE AccountNum = @AccountNum
  9. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
  10. BEGIN
  11. ROLLBACK TRANSACTION --RollBack Transaction if Error..
  12. RETURN
  13. END
  14. ELSE
  15. BEGIN
  16. UPDATE MySavings SET Amount = Amount + @Amount
  17. WHERE AccountNum = @AccountNum
  18. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
  19. BEGIN
  20. ROLLBACK TRANSACTION --RollBack Transaction if Error..
  21. RETURN
  22. END
  23. ELSE
  24. BEGIN
  25. COMMIT TRANSACTION --finally, Commit the transaction if Success..
  26. RETURN
  27. END
  28. END
  29. END
  30. 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. Try Statement 1
  3. Try Statement 2
  4. ...
  5. Try Statement M
  6. END TRY
  7. BEGIN CATCH
  8. Catch Statement 1
  9. Catch Statement 2
  10. ...
  11. Catch Statement N
  12. END CATCH

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

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

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


简单示例:

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

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

  1. ALTER PROC usp_AccountTransaction
  2. @AccountNum INT,
  3. @Amount DECIMAL
  4. AS
  5. BEGIN
  6. BEGIN TRY --Start the Try Block..
  7. BEGIN TRANSACTION -- Start the transaction..
  8. UPDATE MyChecking SET Amount = Amount - @Amount
  9. WHERE AccountNum = @AccountNum
  10. UPDATE MySavings SET Amount = Amount + @Amount
  11. WHERE AccountNum = @AccountNum
  12. COMMIT TRAN -- Transaction Success!
  13. END TRY
  14. BEGIN CATCH
  15. IF @@TRANCOUNT > 0
  16. ROLLBACK TRAN --RollBack in case of Error
  17. -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception
  18. RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
  19. END CATCH
  20. END
  21. GO 
转载:http://www.it118.org/Specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/4444b6c8-6dae-4c65-8d6d-beb334aee3e3.htm
posted on 2011-04-22 14:59  搏击的小船  阅读(772)  评论(0编辑  收藏  举报