Microsoft SQL Server
ПОПРОБУЙ ПОЙМАТЬ
Поиск…
замечания
TRY / CATCH - это языковая конструкция, специфичная для T-SQL MS SQL Server.
Он позволяет обрабатывать ошибки в T-SQL, подобно тому, как это видно в коде .NET.
Транзакция в TRY / CATCH
Это приведет к откату обеих вставок из-за недопустимого datetime:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, 'not a date', 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION -- First Rollback and then throw.
THROW
END CATCH
Это зафиксирует обе вставки:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
THROW
ROLLBACK TRANSACTION
END CATCH
Повышение ошибок в блоке try-catch
Функция RAISERROR генерирует ошибку в блоке TRY CATCH:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
RAISERROR со вторым параметром больше 10 (11 в этом примере) прекратит выполнение в TRY BLOCK и вызовет ошибку, которая будет обрабатываться в блоке CATCH. Вы можете получить доступ к сообщению об ошибке, используя функцию ERROR_MESSAGE (). Выход этого образца:
First statement
Error: Here is a problem!
Получение информационных сообщений в блоке try catch
RAISERROR с серьезностью (второй параметр), меньшей или равной 10, не будет генерировать исключение.
BEGIN TRY
print 'First statement';
RAISERROR( 'Here is a problem!', 10, 15);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
После утверждения RAISERROR будет выполнен третий оператор, и блок CATCH не будет вызываться. Результатом выполнения является:
First statement
Here is a problem!
Second statement
Исключение переброски, созданное RAISERROR
Вы можете повторно выбросить ошибку, которую вы поймаете в блоке CATCH, используя инструкцию TRHOW:
DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Обратите внимание, что в этом случае мы поднимаем ошибку с форматированными аргументами (четвертый и пятый параметры). Это может быть полезно, если вы хотите добавить дополнительную информацию в сообщение. Результатом выполнения является:
First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'
Исключение исключения в блоках TRY / CATCH
Вы можете создать исключение в блоке try catch:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
THROW 51000, @msg, 15;
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
Исключение с обработкой в блоке CATCH, а затем повторно выбрасывается с использованием THROW без параметров.
First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!
THROW похож на RAISERROR со следующими отличиями:
- Рекомендация заключается в том, что в новых приложениях вместо RASIERROR следует использовать THROW.
- THROW может использовать любое число в качестве первого аргумента (номер ошибки), RAISERROR может использовать только идентификаторы в представлении sys.messages
- THROW имеет серьезность 16 (нельзя изменить)
- THROW не может форматировать аргументы, такие как RAISERROR. Используйте функцию FORMATMESSAGE в качестве аргумента RAISERROR, если вам нужна эта функция.