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

转载 2012年03月21日 11:02:14

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


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

begin try --SQL end try begin catch --sql (处理出错动作) end catch 我们将可能会出错的sql 写在begin try...end try ...
  • hejisan
  • hejisan
  • 2016年09月24日 16:49
  • 2560

sql server try...catch使用 异常处理 不错的SQL错误处理

---提供事物回滚功能+错误信息的记录 ---如果不需要回滚,直接把事务去掉就OK啦! ---BEGIN TRAN ---COMMIT TRAN ---ROLLBACK --create table ...
  • ArvinStudy
  • ArvinStudy
  • 2012年11月16日 17:06
  • 2283

Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。 在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对...
  • u014136713
  • u014136713
  • 2016年05月13日 17:55
  • 6495

Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别代表什么意义?在try块中可以抛出异常吗?

try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。 catch块表示一个异常捕获块。当...
  • CWH615
  • CWH615
  • 2016年10月28日 11:07
  • 4713

Java异常处理之throw, throws,try和catch

程序运行过程中可能会出现异常情况,比如被0除、对负数计算平方根等,还有可能会出现致命的错误,比如内存不足,磁盘损坏无法读取文件等,对于异常和错误情况的处理,统称为异常处理。Java异常处理主要通过5个...
  • xx326664162
  • xx326664162
  • 2015年11月04日 14:03
  • 2343

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的 接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一 个方法出现异常后...
  • u014617239
  • u014617239
  • 2016年08月14日 19:58
  • 996

sql serverl 事物回滚三(try...catch事务回滚)

--1.第一种。try catch  Begin Try     Begin Tran Tran1         insert into t1(Id, c1) values(1,'...
  • u010636606
  • u010636606
  • 2016年09月07日 17:50
  • 1721

SqlServer try catch 捕获不到的一些错误及解决方法

IF (OBJECT_ID('AA','U') IS NOT NULL) DROP TABLE AA CREATE TABLE AA(ID INT) SELECT * FROM AA --注:数据...
  • kk185800961
  • kk185800961
  • 2014年10月13日 13:30
  • 14357

try catch整个函数

#include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv[])  try {    ...
  • he_zhidan
  • he_zhidan
  • 2015年10月22日 16:54
  • 635

SQL Server 2005 TRY CATCH 中的异常不能捕获导致事务无法提交

SQLServer帮助中:Transact-SQL 中使用 TRY...CATCH 说明: 编译错误和语句级重新编译错误  TRY...CATCH 将不处理 什么是:编译错误和语句级重新编译错误...
  • blue_morning
  • blue_morning
  • 2015年04月15日 23:40
  • 1057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用TRY CATCH进行SQL Server异常处理<转载>
举报原因:
原因补充:

(最多只允许输入30个字)