一、定义
对 Transact-SQL 实现与 Microsoft Visual C# 和 Microsoft Visual C++ 语言中的异常处理类似的错误处理。Transact-SQL语句组可以包含在 TRY 块中。 如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。
二、注意事项
- TRY…CATCH 构造可对严重程度高于 10 但不关闭数据库连接的所有执行错误进行缓存。
- TRY 块后必须紧跟相关联的 CATCH 块。在 END TRY 和 BEGIN CATCH 语句之间放置任何其他语句都将生成语法错误。
- TRY…CATCH 构造不能跨越多个批处理。 TRY…CATCH 构造不能跨越多个 Transact-SQLTransact-SQL 语句块。例如,TRY…CATCH 构造不能跨越 Transact-SQLTransact-SQL 语句的两个 BEGIN…END 块,且不能跨越 IF…ELSE 构造。
4. 如果 TRY 块所包含的代码中没有错误,则当 TRY 块中最后一个语句完成运行时,会将控制传递给紧跟在相关联的 END CATCH 语句之后的语句。 - 如果 TRY 块所包含的代码中有错误,则会将控制传递给相关联的 CATCH 块的第一个语句。当 CATCH 块中的代码完成时,会将控制传递给紧跟在 END CATCH 语句之后的语句。
- 由 CATCH 块捕获的错误不会返回到调用应用程序。如果错误消息的任何部分都必须返回到应用程序,则 CATCH 块中的代码必须使用 SELECT 结果集或 RAISERROR 和 PRINT 语句之类的机制执行此操作。
- TRY…CATCH 构造可以是嵌套式的。TRY 块或 CATCH 块均可包含嵌套的 TRY…CATCH 构造。 例如,CATCH 块可以包含内嵌的 TRY…CATCH 构造,以处理 CATCH 代码所遇到的错误。
- 处理 CATCH 块中遇到的错误的方法与处理任何其他位置生成的错误一样。如果 CATCH 块包含嵌套的 TRY…CATCH 构造,则嵌套的 TRY 块中的任何错误都会将控制传递给嵌套的 CATCH 块。如果没有嵌套的 TRY…CATCH 构造,则会将错误传递回调用方。
- 不能使用 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;