T-SQL TRY CATCH的问题?

时间:2011-05-16 14:00:23

标签: sql-server tsql try-catch

我们目前正在使用SQL 2005,我正在将旧的Foxpro系统迁移到由SQL Server支持的新Web应用程序。我在T-SQL中使用TRY CATCH进行事务处理,它似乎工作得很好。工作中的其他程序员之一担心这一点,因为他说他听说过一些问题,其中的口号并不总能发现错误。我已经击败了sproc to death并且无法让它失败(错过捕获)并且我在网上搜索的唯一问题是它不会返回错误数字的正确错误号< 5000.有没有人在T-SQL中遇到TRY CATCH的任何其他问题 - 特别是如果它错过了捕获?感谢您提供的任何意见。

5 个答案:

答案 0 :(得分:23)

TRY ... CATCH没有捕获所有可能的错误,但未捕获的错误在BOL中有详细记录Errors Unaffected by a TRY…CATCH Construct

  

TRY ... CATCH构造不会陷阱   以下条件:

     
      
  • 严重性为10或更低的警告或信息性消息。
  •   
  • 严重性为20或更高的错误,可以阻止SQL Server   数据库引擎任务处理   会议。如果发生错误   严重程度为20或更高   数据库连接没有中断,   TRY ... CATCH将处理错误。
  •   
  • 注意事项,例如客户端中断请求或损坏   客户关系。
  •   
  • 系统管理员使用KILL结束会话时   言。
  •   
     

以下类型的错误不是   它们由CATCH块处理   发生在同一执行级别   作为TRY ... CATCH构造:

     
      
  • 编译阻止批处理的错误,例如语法错误   运行
  •   
  • 语句级重新编译期间发生的错误,例如   对象名称解析错误   编译后发生因为   延期名称解析。
  •   
     

这些错误将返回到该级别   运行批处理,存储过程,   或触发。

答案 1 :(得分:1)

在我的经历中有一个案例,当TRY ... CATCH块没有发现错误时。与排序相关的错误: 无法在等于操作中解决“Latin1_General_CI_AS”和“Latin1_General_CI_AI”之间的排序规则冲突。 也许这个错误对应于BOL中记录的错误类型之一。

  

语句级重新编译期间发生的错误,例如object   编译后因名称解析错误   延期名称解析。

答案 2 :(得分:1)

如果您将“错误”搜索字词传递给TRY ... CATCH

CONTAINSTABLE将无法捕获错误

例如:

DECLARE @WordList VARCHAR(800)
SET @WordList = 'crap"s'
CON

TAINSTABLE(table, *, @WordList)

CONTAINSTABLE会给你一个“语法错误”,任何周围的TRY ... CATCH都无法捕捉到这一点。

这特别令人讨厌,因为错误是由数据引起的,而不是代码中的“真实”语法错误。

答案 3 :(得分:0)

我在SQL Server 2008中工作。我构建了一个带有try / catch的大型sql语句。我通过重命名表(在开发中)测试它。声明爆炸了,没有发现错误。 SQL Server中的try / catch很弱,但总比没有好。这是我的一部分代码。由于我公司的限制,我无法再加入。

    COMMIT TRAN T1;
END TRY
BEGIN CATCH
    -- Save the error.
    SET @ErrorNumber = ERROR_NUMBER();
    SET @ErrorMessage = ERROR_MESSAGE();
    SET @ErrorLine = ERROR_LINE();
    -- Put GSR.dbo.BlahBlahTable back the way it was.
    ROLLBACK TRAN T1;   
END CATCH
-- Output a possible error message. Knowing what line the error happened at really helps with debugging.
SELECT @ErrorNumber as ErrorNumber,@ErrorMessage as ErrorMessage,@ErrorLine AS LineNumber;

答案 4 :(得分:-1)

我从未遇到过TRY ... CATCH ......失败的情况。很可能,Neiteher有很多读过这个问题的人。唉,这只意味着如果存在这样的SQL错误,那么我们还没有看到它。问题是,这是一个非常大的“如果”。信不信由你,微软确实付出了一些努力使他们的核心软件产品非常可靠,而且TRY ... CATCH ......几乎不是一个新概念。一个简单的例子:在SQL 2005中,我遇到了一个可靠的,可证明的,可复制的错误,同时解决了新的表分区问题 - 这个错误已经被补丁修复了。并且TRY ... CATCH ...比表分区使用频率更高。

我说举证责任落在你的同事身上。如果他“在某个地方听到了”,那么他应该尝试用某种证据支持它。互联网充满了古老谚语的证据“只因为每个人都这样说,并不代表他们是对的”。