サーチ…


備考

TRY / CATCHは、MS SQL ServerのT-SQL固有の言語構造です。

これは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

2番目のパラメータが10より大きいRAISERROR(この例では11)は、TRY BLOCKで実行を停止し、CATCHブロックで処理されるエラーを発生させます。 ERROR_MESSAGE()関数を使用してエラーメッセージにアクセスできます。このサンプルの出力は次のとおりです。

First statement
Error: Here is a problem!

try catchブロックで情報メッセージを生成する

重大度(第2パラメータ)が10以下のRAISERRORは例外をスローしません。

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ステートメントの後、3番目のステートメントが実行され、CATCHブロックは呼び出されません。実行結果は次のとおりです。

First statement
Here is a problem!
Second statement

RAISERRORによって生成された再スロー例外

TRHOW文を使用してCATCHブロックにキャッチしたエラーを再スローすることができます。

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

この場合、フォーマットされた引数(4番目と5番目のパラメータ)でエラーが発生していることに注意してください。これは、メッセージに詳細を追加する場合に便利です。実行結果は次のとおりです。

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ビューでIDのみを使用できます
  • スルーの重大度は16です(変更できません)
  • THROWはRAISERRORのような引数をフォーマットできません。この機能が必要な場合は、RAISERRORの引数としてFORMATMESSAGE関数を使用してください。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow