使用Try…Catch块进行T-SQL错误处理


SQL Server的错误处理或异常处理一直都是T-SQL开发中比较麻烦的部分。在过去,每一条语句运行后,你都要手动地进行错误检查,然后逐个错误的进行处理。SQL Server事务管理同样非常麻烦,你需要找出事务的状态,然后恰当的将其回滚或者提交。

  而今,通过在SQL Server 2005中为T-SQL添加Try…Catch块,微软给我们提供了新的,更加健壮的错误处理能力。在本文中,我们将看到Try…Catch块是如何工作的,并告诉你如何你在代码使用他们。同时,我们还将提供一些使用以前的方法处理问题和使用现代方法处理问题的对比,是你更好的理解如何使用Try…Catch。

  Try…Catch的定义

  为了理解Try…Catch块,你必须先明白异常处理的概念。异常处理非常简单:在执行你的代码时,那些非计划之内发生的事情就是异常,你需要做一些事情对它进行处理。至于如何处理异常,则由开发人员,也就是你来决定。

  为了是你的T-SQL代码可以处理异常,你就需要使用Try…Catch块。如果你使用过Visual Studio,那么你可能对Try…Catch块的概念很熟悉。T-SQL中的Try…Catch块虽然与完全成熟的Visual Studio中的很相似,但实际上它少了一些选项。在使用Try…Catch块时,将你所编写的需要运行的T-SQL代码放入Try块中。如果在运行这段代码时,如果一个严重级别是10级或者更高的错误发生,就会转到Catch块中运行那里面的异常处理代码。它的基本结构如下所示:

  BEGIN TRY

  [T-SQL代码写在这里]

  END TRY

  BEGIN CATCH

  [异常处理代码写在这里]

  END CATCH

  在T-SQL中使用Try…Catch块时,你需要注意以下这些关键问题
Try块后面必须要直接接一个Catch块,否则就会发生一个错误。

  Try…Catch不能嵌套。

  如果Try块中的代码没有故障,将跳过Catch块,执行Catch块后的第一条语句。

  当Catch块中的代码运行完毕后,将执行Catch块后的第一条语句。

  处理错误

  当一个错误发生后,你作为一名开发者需要决定如何处理它。因为你不能像.Net语言那样,将控制权重新转回引起错误的代码上,你所能做的可能就是将问题记入日志,并将所执行的事务进行回滚。为了帮助记录,有一些系统函数提供了错误的更全面的信息,这些函数的具体内容如下所示:

  ERROR_NUMBER() – 返回错误号。

  ERROR_SEVERITY() – 返回错误严重级别。

  ERROR_STATE() – 返回错误状态。

  ERROR_PROCEDURE() - 返回错误所在的存储过程或触发器的名称。

  ERROR_LINE() - 返回错误所在行的行号。

  ERROR_MESSAGE() - 返回错误的实际信息。

  使用这些函数,你可以记录错误的详细信息,并将这些信息返回给调用它的过程或者记录,以便对错误进行追踪和修复。这些函数只能在Catch块被调用,在其它地方使用会返回NULL。然而,这些函数可以被Catch块中的代码所使用。也就是说,你可以调用一个存储过程来处理错误,于是这个存储过程就可以调用这些错误函数。下面就是这样的存储过程的一个示例: 

createPROCEDUREspLogError 
  AS 
  --给应用程序返回错误的详细信息 
  select 
  ERROR_NUMBER()ASErrNum, 
  ERROR_SEVERITY()ASErrSev, 
  ERROR_STATE()asErrState, 
  ERROR_PROCEDURE()asErrProc, 
  ERROR_LINE()asErrLine, 
  ERROR_MESSAGE()asErrMsg 
  --将错误记入错误数据库日志 
  insertINTOSQLErrors.dbo.ErrorLog 
  VALUES(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(), 
  ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE())


  错误和异常处理对于所有好的编程规范都是至关重要的。现在使用SQL Server 2005提供的Try…Catch块,你可以实现更好的错误处理……

  这个过程可以在你的Catch块中被调用,用来返回和记录错误的详细信息。

  BEGIN TRY

  --在这里插入代码:当错误发生时,控制权将被转到Catch块

  END TRY

  BEGIN CATCH

  --这个过程将会记录错误并将详细信息返回给调用它的应用程序

  exec spLogError

  END CATCH

  使用XACT_STATE()函数

  还有一个错误函数我们在前面没有讨论,那就是XACT_STATE()函数。它可以在你的Catch块中被调用,返回你的过程中事务的准确状态。XACT_STATE()函数的返回值及其意义如下所示:

  1 : 有一个活动的事务,它可以被提交或者回滚。

  0 : 没有活动的事务。

  -1 : 有一个活动的事务,但由于有错误发生,事务不能被提交。

  基于这些返回值,你就可以处理你的食物。如果返回值是1,你可以正常的提交或者回滚。如果返回值是0,则并没有打开的事务,如果尝试提交将会产生一个错误。返回值-1比较特殊,它意味着有一个事物,但是它不能被提交。如果返回值是-1的话,你也不能回滚到一个保存点,而只能将整个事务进行回滚。

  错误和异常处理对于所有好的编程规范都是至关重要的。现在使用SQL Server 2005提供的Try…Catch块,你可以实现更好的错误处理。



相关阅读:
VBS编程教程 (第3篇)
HTML表格标记教程(35):跨列属性COLSPAN
在Ubuntu下试用OpenOffice.org 3 Beta
Server Core 下执行IIS7 的完整安装
迁移秘诀: 方便 Exchange 2000 迁移的 Exmerge 2000
sql 函数大全 比较常用的一些函数整理
Windows2003配置TCP/IP并测试
MySQL的启动和连接
tomcat 3.1在RedHat下的安装
Windows 系统蓝屏分析工具
查找行中的第一个数据串
FreeBSD 使用watch监视终端
如何将XAML集成到WINCE 6.0系统设计中
Ext javascript建立超链接,进行事件处理的实现方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 青年志愿者协会工作计划 诉衷情(西湖) 山水田园诗的鉴赏 复活 读后感500字 女人半生缘(126) 我们不承担谁承担 最爱的人先放手 祖国,我要歌唱你!作文1400字 高中高一作文900字:采访记 海底捞、小肥羊、如家、汉庭、7天等连锁餐饮酒 无过之过 2015比赛场次教学反思 会计工作组织的内容 搞笑的《米老鼠》动画片 由方仲永所想到的——伤仲永读后感 青春并不如歌(二)作文2100字 散文:有一种东西觉悟 一颗心的距离。 你懂难过到沉默甚至大笑吗 属于你的记忆,到此为止 美国总统,罗斯福 鸡蛋孵出小鸡 校园晨曲250字 水族馆游记的作文 悬赏广告性质的辨析 去乡下作文300字 受用一生的6个字 【原创】夜幕下的清梦 点滴意林 我的爱人!我在期待着你的到来,我在苦苦寻觅着你 小学四年级作文450字:我的窃读记 2011年高三英语教学计划 笑着流泪作文600字 CPA实习日记 你给我的世界 欣赏生命600字 送僧南游 懒惰骄傲的孔雀作文500字 关于四年级重阳节作文400字范文 演讲要给听众留下想象的空间 从孩子得到的启示 2016企业员工入党转正申请书600字范文 县城电网改造浅析 爱上电脑作文700字 《风去的时候》 淡淡伤感的唯美句子 做新时代的文化人 培训工作总结 四有教师学习体会:做新时代四有教师 感恩节精炼短信

Copyright © 2016 phpStudy |