Microsoft SQL Server
TRY / CATCH
サーチ…
備考
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