Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 为什么T-sqltry/CATCH如此有限?_Tsql_Try Catch - Fatal编程技术网

Tsql 为什么T-sqltry/CATCH如此有限?

Tsql 为什么T-sqltry/CATCH如此有限?,tsql,try-catch,Tsql,Try Catch,有几种类型的错误T-SQL的TRY/CATCH根本无法捕获(见下文)。其中一些是可以理解的(尽管我更喜欢捕获低严重性错误,因为它们会出现在应用程序代码中),还有一些是不可避免的,因为终止会话的错误甚至不允许执行捕获 但是为什么在同一范围内限制编译错误呢?这是不可能处理的还是一个深思熟虑的决定?如果是后者,原因是什么?为什么我们可以在编译错误到达父作用域而不是当前作用域时捕获它们 另外,我也不在“过去的好日子”中,但显然,使用旧的错误处理方法可以捕捉到这些错误,所以为什么不至少在引擎盖下以同样的方

有几种类型的错误T-SQL的TRY/CATCH根本无法捕获(见下文)。其中一些是可以理解的(尽管我更喜欢捕获低严重性错误,因为它们会出现在应用程序代码中),还有一些是不可避免的,因为终止会话的错误甚至不允许执行捕获

但是为什么在同一范围内限制编译错误呢?这是不可能处理的还是一个深思熟虑的决定?如果是后者,原因是什么?为什么我们可以在编译错误到达父作用域而不是当前作用域时捕获它们

另外,我也不在“过去的好日子”中,但显然,使用旧的错误处理方法可以捕捉到这些错误,所以为什么不至少在引擎盖下以同样的方式处理呢

  • 严重性为10或更低的警告或信息性消息

  • 严重性为20或更高的错误会停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高的错误,并且数据库连接未中断,则TRY…CATCH将处理该错误

  • 注意事项,如客户端中断请求或断开的客户端连接

  • 系统管理员使用KILL语句结束会话时

当以下类型的错误与TRY…CATCH构造发生在同一执行级别时,CATCH块不会处理这些错误:

  • 编译错误,如语法错误,会阻止批处理运行

  • 语句级重新编译期间发生的错误,例如编译后由于延迟的名称解析而发生的对象名称解析错误

  • 对象名称解析错误


“为什么”的问题并不容易。有些决策只为DB引擎开发者/产品所有者所知。我建议:对于语法错误,在运行前首先解析整个批处理;如果出现语法错误,则由于批处理未运行,
TRY…CATCH
将永远不会发生。这就像在C语言中期待一个
TRY…CATCH
来捕获一个语法错误,但是,由于所述语法错误,您无法构建项目。