Поиск…


замечания

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, если вам нужна эта функция.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow