Оператор TRY / CATCH в Transact-SQL обнаруживает и обрабатывает состояния ошибок в приложениях баз данных. Это утверждение является краеугольным камнем SQL Обработка ошибок сервера - важная часть разработки надежных приложений баз данных.
TRY / CATCH применяется к SQL Server, начиная с 2008 года, Базе данных SQL Azure, Хранилищу данных SQL Azure и Хранилищу параллельных данных.
Представляем TRY / CATCH
TRY./CATCH работает, определяя два оператора Transact-SQL: один, который вы хотите «попробовать», а другой использовать для «отлова» любых возможных ошибок. Когда SQL Server встречает инструкцию TRY / CATCH, он немедленно выполняет инструкцию, включенную в предложение TRY. Если инструкция TRY выполняется успешно, SQL Server продолжает работу. Однако, если инструкция TRY вызывает ошибку, SQL Server выполняет инструкцию CATCH для корректной обработки ошибки.
Основной синтаксис имеет такую форму:
НАЧАТЬ ПОПРОБОВАТЬ
{sql_statement | блок операторов}
КОНЕЦ ПОПЫТКИ
НАЧАТЬ ЛОВ
[{sql_statement | statement_block}]
КОНЕЦ ЗАХВАТ
[; ]
Пример TRY / CATCH
Рассмотрим базу данных кадровых ресурсов, содержащую таблицу с именем сотрудники, который содержит информацию о каждом сотруднике компании. В этой таблице используется целочисленный идентификационный номер сотрудника в качестве первичный ключ.
Вы можете попытаться использовать приведенный ниже оператор, чтобы вставить нового сотрудника в свою базу данных:
ВСТАВИТЬ сотрудников (id, first_name, last_name, extension)
ЦЕННОСТИ (12497, «Майк», «Чаппл», 4201)
При нормальных обстоятельствах этот оператор добавит строку в таблицу «Сотрудники». Однако, если сотрудник с идентификатором 12497 уже существует в базе данных, вставка строки нарушит ограничение первичного ключа и приведет к следующей ошибке:
Msg 2627, уровень 14, состояние 1, строка 1
Нарушение ограничения PRIMARY KEY PK_employee_id. Невозможно вставить повторяющийся ключ в объект dbo.employees.
Заявление было прекращено.
Хотя эта ошибка предоставляет вам информацию, необходимую для устранения проблемы, с ней связаны две проблемы. Во-первых, сообщение непонятное. Он включает в себя коды ошибок, номера строк и другую информацию, непонятную для обычного пользователя. Во-вторых, что более важно, это вызывает прерывание выполнения оператора и может вызвать сбой приложения.
Альтернативный вариант - заключить этот оператор в оператор TRY… CATCH, как показано здесь:
НАЧАТЬ ПОПРОБОВАТЬ
ВСТАВИТЬ сотрудников (id, first_name, last_name, extension)
ЦЕННОСТИ (12497, «Майк», «Чаппл», 4201)
КОНЕЦ ПОПЫТКИ
НАЧАТЬ ЛОВ
ПЕЧАТЬ 'ОШИБКА:' + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Почта сотрудника',
@recipients = '[email protected]',
@body = 'Произошла ошибка при создании новой записи о сотруднике.',
@subject = 'Ошибка базы данных сотрудников';
КОНЕЦ ЗАХВАТ
В этом примере обо всех возникающих ошибках сообщается как пользователю, выполняющему команду, так и на адрес электронной почты [email protected]. Пользователь видит следующую ошибку:
Ошибка: нарушение ограничения PRIMARY KEY "PK_employee_id".
Невозможно вставить повторяющийся ключ в объект dbo.employees.
Почта в очереди.
Выполнение приложения продолжается в обычном режиме, позволяя программисту обработать ошибку. Использование оператора TRY / CATCH - это элегантный способ упреждающего обнаружения и обработки ошибок, возникающих в приложениях баз данных SQL Server.
Узнать больше
Чтобы узнать больше о языке структурированных запросов, ознакомьтесь с нашей статьей Основы SQL.