DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 910|回复: 0
打印 上一主题 下一主题

[待整理] 使用Try…Catch块进行T-SQL错误处理

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 15:12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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块中的代码所使用。也就是说,你可以调用一个存储过程来处理错误,于是这个存储过程就可以调用这些错误函数。下面就是这样的存储过程的一个示例:
  CREATE PROCEDURE spLogError
              AS
              --给应用程序返回错误的详细信息
              SELECT
              ERROR_NUMBER() AS ErrNum,
              ERROR_SEVERITY() AS ErrSev,
              ERROR_STATE() as ErrState,
              ERROR_PROCEDURE() as ErrProc,
              ERROR_LINE() as ErrLine,
              ERROR_MESSAGE() as ErrMsg
              --将错误记入错误数据库日志
              INSERT INTO SQLErrors.dbo.ErrorLog
              VALUES(ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(),
              ERROR_PROCEDURE(), ERROR_LINE(),ERROR_MESSAGE())


      这个过程可以在你的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块,你可以实现更好的错误处理。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-9-27 17:33 , 耗时 0.089984 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表