SQL Server中的TRY CATCH捕捉异常

参考网址

目录

  • 一、定义
  • 二、注意事项
  • 三、检索错误信息
  • 四、实际应用

一、定义

对 Transact-SQL 实现与 Microsoft Visual C# 和 Microsoft Visual C++ 语言中的异常处理类似的错误处理。Transact-SQL语句组可以包含在 TRY 块中。 如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。

二、注意事项

  1. TRY…CATCH 构造可对严重程度高于 10 但不关闭数据库连接的所有执行错误进行缓存。
  2. TRY 块后必须紧跟相关联的 CATCH 块。在 END TRY 和 BEGIN CATCH 语句之间放置任何其他语句都将生成语法错误。
  3. TRY…CATCH 构造不能跨越多个批处理。 TRY…CATCH 构造不能跨越多个 Transact-SQLTransact-SQL 语句块。例如,TRY…CATCH 构造不能跨越 Transact-SQLTransact-SQL 语句的两个 BEGIN…END 块,且不能跨越 IF…ELSE 构造。
    4. 如果 TRY 块所包含的代码中没有错误,则当 TRY 块中最后一个语句完成运行时,会将控制传递给紧跟在相关联的 END CATCH 语句之后的语句。
  4. 如果 TRY 块所包含的代码中有错误,则会将控制传递给相关联的 CATCH 块的第一个语句。当 CATCH 块中的代码完成时,会将控制传递给紧跟在 END CATCH 语句之后的语句。
  5. 由 CATCH 块捕获的错误不会返回到调用应用程序。如果错误消息的任何部分都必须返回到应用程序,则 CATCH 块中的代码必须使用 SELECT 结果集或 RAISERROR 和 PRINT 语句之类的机制执行此操作。
  6. TRY…CATCH 构造可以是嵌套式的。TRY 块或 CATCH 块均可包含嵌套的 TRY…CATCH 构造。 例如,CATCH 块可以包含内嵌的 TRY…CATCH 构造,以处理 CATCH 代码所遇到的错误。
  7. 处理 CATCH 块中遇到的错误的方法与处理任何其他位置生成的错误一样。如果 CATCH 块包含嵌套的 TRY…CATCH 构造,则嵌套的 TRY 块中的任何错误都会将控制传递给嵌套的 CATCH 块。如果没有嵌套的 TRY…CATCH 构造,则会将错误传递回调用方。
  8. 不能使用 GOTO 语句输入 TRY 或 CATCH 块,GOTO statements cannot be used to enter a TRY or CATCH block. 使用 GOTO 语句可以跳转至同一 TRY 或 CATCH 块内的某个标签,或离开 TRY 或 CATCH 块。
    10.不能在用户定义函数内使用 TRY…CATCH 构造。

三、检索错误信息

错误信息 释义
ERROR_NUMBER() 返回错误编号
ERROR_SEVERITY() 返回严重性
ERROR_STATES() 返回错误状态
ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称
ERROR_LINE() 返回导致错误例程中的行号
ERROR_MESSAGE() 返回错误消息的完整文本

四、实际应用

-- Verify that the stored procedure does not already exist.  
IF OBJECT_ID ( 'usp_GetErrorInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE usp_GetErrorInfo;  
GO  
  
-- Create procedure to retrieve error information.  
CREATE PROCEDURE usp_GetErrorInfo  
AS  
SELECT  
    ERROR_NUMBER() AS ErrorNumber  
    ,ERROR_SEVERITY() AS ErrorSeverity  
    ,ERROR_STATE() AS ErrorState  
    ,ERROR_PROCEDURE() AS ErrorProcedure  
    ,ERROR_LINE() AS ErrorLine  
    ,ERROR_MESSAGE() AS ErrorMessage;  
GO  
  
BEGIN TRY  
    -- Generate divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    -- Execute error retrieval routine.  
    EXECUTE usp_GetErrorInfo;  
END CATCH;

你可能感兴趣的:(数据库,sql,数据库)