我们目前正在使用SQL 2005,我正在将旧的Foxpro系统迁移到由SQL Server支持的新Web应用程序。我在T-SQL中使用TRY CATCH进行事务处理,它似乎工作得很好。工作中的其他程序员之一担心这一点,因为他说他听说过一些问题,其中的口号并不总能发现错误。我已经击败了sproc to death并且无法让它失败(错过捕获)并且我在网上搜索的唯一问题是它不会返回错误数字的正确错误号< 5000.有没有人在T-SQL中遇到TRY CATCH的任何其他问题 - 特别是如果它错过了捕获?感谢您提供的任何意见。
答案 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 ...比表分区使用频率更高。
我说举证责任落在你的同事身上。如果他“在某个地方听到了”,那么他应该尝试用某种证据支持它。互联网充满了古老谚语的证据“只因为每个人都这样说,并不代表他们是对的”。