Skip to main content

使用TRY ... CATCH处理SQL Server错误

【java基础】之day29_13(JDBC)PrepareStatement接口预编译SQL语句 黑马程序员/传智博客 (六月 2025)

【java基础】之day29_13(JDBC)PrepareStatement接口预编译SQL语句 黑马程序员/传智博客 (六月 2025)
Anonim

Transact-SQL中的TRY … CATCH语句检测并处理数据库应用程序中的错误情况。此语句是SQL Server错误处理的基石,也是开发健壮的数据库应用程序的重要部分。 TRY … CATCH适用于从2008开始的SQL Server,Azure SQL数据库,Azure SQL数据仓库和并行数据仓库。

介绍TRY … CATCH

TRY … CATCH的工作原理是允许您指定两个Transact-SQL语句:一个要“尝试”,另一个用于“捕获”可能出现的任何错误。当SQL Server遇到TRY … CATCH语句时,它会立即执行TRY子句中包含的语句。如果TRY语句成功执行,SQL Server将继续运行。但是,如果TRY语句生成错误,SQL Server将执行CATCH语句以正常处理错误。

基本语法采用以下形式:

开始尝试 声明块 结束开始捕捉sql_statement结束捕捉 ;

尝试…捕捉示例

通过一个例子很容易理解这个陈述的用法。想象一下,您是包含名为“Employees”的表的人力资源数据库的管理员,该表包含有关组织中每个员工的信息。该表使用整数员工ID号作为主键。您可以尝试使用以下语句将新员工插入数据库:

INSERT INTO员工(id,first_name,last_name,extension)价值观(12497,'Mike','Chapple',4201)

在正常情况下,此语句将向Employees表添加一行。但是,如果数据库中已存在ID为12497的员工,则插入该行将违反主键约束并导致以下错误:

Msg 2627,Level 14,State 1,Line 1违反PRIMARY KEY约束'PK_employee_id'。无法在对象'dbo.employees'中插入重复键。该语句已终止。

虽然此错误为您提供了解决问题所需的信息,但它有两个问题。首先,信息是神秘的。它包括错误代码,行号和普通用户无法理解的其他信息。其次,更重要的是,它会导致语句中止并可能导致应用程序崩溃。另一种方法是将语句包装在TRY … CATCH语句中,如下所示:

开始尝试INSERT INTO员工(id,first_name,last_name,extension)价值观(12497,'Mike','Chapple',4201)结束开始捕捉PRINT'ERROR:'+ ERROR_MESSAGE();EXEC msdb.dbo.sp_send_dbmail@profile_name ='员工邮件',@recipients ='[email protected]',@body ='创建新员工记录时出错。',@subject ='员工ID重复错误';结束捕捉

在此示例中,发生的任何错误都会报告给执行命令的用户和[email protected]电子邮件地址。向用户显示的错误是:

错误:违反PRIMARY KEY约束'PK_employee_id'。 无法在对象'dbo.employees'中插入重复键。邮件排队。

应用程序执行正常,允许程序员处理错误。使用TRY … CATCH语句是主动检测和处理SQL Server数据库应用程序中发生的错误的一种优雅方式。

了解更多

如果要了解有关结构化查询语言的更多信息,请查看SQL简介。