SQL TRY CATCH

SQL Try Catch 可帮助您有效处理查询错误。就像 Java 或 C# 中的异常处理一样,Microsoft Server 为我们提供了 TRY CATCH 结构。

例如,我们在 TRY 块中编写一系列语句。然后,如果服务器发现错误,它将退出 TRY 块并进入 CATCH 块;它将执行 CATCH 块中的语句。最后,它将返回相应的错误描述。

在开始使用 SQL Try catch 之前,您需要记住以下几点。

  • CATCH 块必须紧跟在每个 TRY 块之后。您不允许在 END TRY 和 BEGIN CATCH 之间包含任何语句。
  • 如果 TRY 块中没有错误,控制将不会进入 CATCH 块。这意味着控制器将执行 END CATCH 之后的语句。
  • 如果 TRY 块中发生错误,它将立即退出 Try 块并进入 Catch 块。
  • TRY CATCH 将捕获所有严重性大于 10 且小于 20 的错误。
  • 它允许您使用嵌套 TRY 块(TRY CATCH 嵌套在另一个 TRY CATCH 中)。
  • 但是,CATCH 块无法处理编译错误,例如语法错误。

SQL Server TRY CATCH 语法

Try Catch 的语法如下所示。

BEGIN TRY
	-- Statements;
END TRY
BEGIN CATCH
        -- Statements;
END CATCH

在 Catch 块中,使用以下系统函数来获取有关错误的信息。

SQL TRY CATCH 示例

在此 Try Catch 示例中,我们将计算 10/0 的结果。

BEGIN TRY
	SELECT 10/0 AS Result;
END TRY
BEGIN CATCH
	SELECT ERROR_MESSAGE() AS [Error Message]
	      ,ERROR_LINE() AS ErrorLine
	      ,ERROR_NUMBER() AS [Error Number]  
              ,ERROR_SEVERITY() AS [Error Severity]  
              ,ERROR_STATE() AS [Error State]  
END CATCH
SQL TRY CATCH 1

在 TRY 块中,我们计算 10/0 的结果。众所周知,任何数除以零都会出错。一旦遇到错误,它将进入 CATCH 块。

SELECT 10/0 AS Result;

此 try catch 查询将返回状态、严重性、错误编号、错误发生的行以及解释错误的 message。

SELECT ERROR_MESSAGE() AS [Error Message]
      ,ERROR_LINE() AS ErrorLine
      ,ERROR_NUMBER() AS [Error Number]  
      ,ERROR_SEVERITY() AS [Error Severity]  
      ,ERROR_STATE() AS [Error State]

TRY CATCH 示例 2

在此示例中,我们展示了该过程的实际工作原理。在这里,我们使用不同的打印语句来显示 SQL TRY 和 Catch 块的开始和结束。

DECLARE @Number TINYINT,
	@Result TINYINT
BEGIN TRY
    PRINT N'This Message is From Start of the TRY BLOCK'
    SET @Number = 254;
    PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
    SET @Result = @Number + 1;
    PRINT N'This Message is From End of the TRY BLOCK'
SELECT @Number AS Number, 
       @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'This Message is From Start of the CATCH BLOCK'
    PRINT N'Error Message = ' + ERROR_MESSAGE()
    PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
    PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
    PRINT N'This Message is From End of the CATCH BLOCK'
END CATCH

结果选项卡

Number | Result
---------------
254    | 255

让我检查 Message 选项卡

TRY CATCH 3

从上面的屏幕截图可以看到,它只打印了 SQL TRY 块中的语句。

SQL TRY CATCH 错误处理示例 3

如何使用 try catch 处理错误。这与前面的示例是相同的代码,但我们将 @Number 从 254 改为了 255。

DECLARE @Number TINYINT,
	@Result TINYINT
BEGIN TRY
    PRINT N'This Message is From Start of the TRY BLOCK'
    SET @Number = 255;
    PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
    SET @Result = @Number + 1;
    PRINT N'This Message is From End of the TRY BLOCK'
SELECT @Number AS Number, 
       @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'This Message is From Start of the CATCH BLOCK'
    PRINT N'Error Message = ' + ERROR_MESSAGE()
    PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
    PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
    PRINT N'This Message is From End of the CATCH BLOCK'
END CATCH

在此 try catch 错误处理示例中,首先,我们声明了两个 tinyint 变量。

DECLARE @Number TINYINT,
	@Result TINYINT

接下来,在 TRY 块中,我们将 255 赋给了 Number 变量,并对 result 变量进行了加法运算。

PRINT N'This Message is From Start of the TRY BLOCK'
    SET @Number = 255;
    PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
    SET @Result = @Number + 1;
    PRINT N'This Message is From End of the TRY BLOCK'

众所周知,tiny int 的最大值为 255,意味着会发生溢出。因此,它将退出 TRY 块并执行我们 CATCH 块中的语句,该语句是:

    PRINT N'This Message is From Start of the CATCH BLOCK'
    PRINT N'Error Message = ' + ERROR_MESSAGE()
    PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
    PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
    PRINT N'This Message is From End of the CATCH BLOCK'
TRY CATCH 4

如果您观察到上面的示例屏幕截图,尽管我们在 TRY 块的末尾有 print 语句,但控制器跳过了该语句。这是因为一旦进入 SET @Result = @Number + 1;,控制就会退出 TRY 块并立即进入 Catch 块。