【问题标题】:Exception Handling not handling Error in SQL-SERVER异常处理未处理 SQL-SERVER 中的错​​误
【发布时间】:2016-04-11 21:19:04
【问题描述】:

我们正在使用Try/Catch block 在我们的stored procedures 中处理Exceptions。在stored procedure 中,我特意制作了error 来检查exceptions 的处理方式。我写了一个stored procedure,如下所示,

CREATE PROCEDURE TEST
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
    BEGIN TRAN
        
              ;WITH CTE
              AS
              (SELECT TOP 10 * 
               FROM student)

               SELECT * FROM CTE

               SELECT * INTO #VAL
               FROM CTE

   
      IF @@ERROR = 0
              BEGIN
                  COMMIT TRAN;
              END
      END TRY
      BEGIN CATCH
              SELECT @@ERROR AS ERROR, ERROR_LINE() AS [Error Line], ERROR_MESSAGE() AS [Error Message] 
      ROLLBACK TRAN;
      END CATCH
SET NOCOUNT OFF;
END

在上面的Stored procedure 中,我已经多次使用了CTE。我预计SQL-SERVER 将处理异常,但它没有。在执行上述stored Procedure 时,我得到了低于error

消息 208,级别 16,状态 1,过程测试,第 16 行

对象名称“CTE”无效。

消息 266,级别 16,状态 2,过程测试,第 16 行

EXECUTE 之后的事务计数表示不匹配的数量 BEGIN 和 COMMIT 语句。先前计数 = 1,当前计数 = 2。

为什么不处理异常?有人可以对此提出想法吗?

感谢您的帮助。

【问题讨论】:

    标签: sql sql-server tsql exception-handling


    【解决方案1】:

    存储过程在执行时遵循延迟的对象名称解析。因此在这种情况下,cte 对它来说是一个不存在的对象。

    Further try catch 无法处理此类错误

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

    Compile errors, such as syntax errors, that prevent a batch from running.
    
    
    Errors that occur during statement-level recompilation, such as **object name resolution errors** that occur after compilation because of deferred name resolution
    

    请参阅MSDN 了解更多信息(请参阅不受 try catch 影响的错误)

    【讨论】:

    • 感谢您教我,msdn 链接真的很有帮助:)
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2010-09-10
    • 2013-12-27
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多