SQL Server の例外処理:THROW と RAISERROR の徹底比較
SQL Server で同じ例外を再スローする方法
THROW キーワードを使用する
同じ例外を再スローするには、THROW
キーワードを使用します。 構文は以下の通りです。
THROW error_number [, message] [, severity]
error_number
は、再スローする例外のエラー番号です。message
は、例外と共に再スローされるオプション メッセージです。severity
は、例外の重大度を指定するオプション パラメーターです。 指定されない場合は、元の重大度が使用されます。
例:
BEGIN
DECLARE @salary DECIMAL(10,2);
SET @salary = -100;
IF @salary < 0
BEGIN
THROW 50000, '給与は負の値にできません。', 16;
END;
SELECT @salary;
END
この例では、@salary
変数の値が負の場合、エラー番号 50000 とメッセージ "給与は負の値にできません。" を持つ例外が再スローされます。 重大度は 16 に設定されているため、これは重大なエラーとして扱われます。
RAISERROR プロシージャを使用する
同じ例外を再スローするもう 1 つの方法は、RAISERROR
プロシージャを使用することです。 構文は以下の通りです。
RAISERROR ([message] [, severity] [, state] [, error_number])
error_number
は、再スローする例外のエラー番号です。 指定されない場合は、50000 が使用されます。
BEGIN
DECLARE @salary DECIMAL(10,2);
SET @salary = -100;
IF @salary < 0
BEGIN
RAISERROR ('給与は負の値にできません。', 16, 1, 50000);
END;
SELECT @salary;
END
この例は、THROW
キーワードを使用した例と同じです。
注意事項
- 例外を再スローする前に、常に例外を処理する必要があります。 例外を単に再スローすると、アプリケーションがクラッシュする可能性があります。
THROW
キーワードまたはRAISERROR
プロシージャを使用する前に、適切なエラー番号とメッセージを選択していることを確認してください。
BEGIN
DECLARE @salary DECIMAL(10,2);
SET @salary = -100;
IF @salary < 0
BEGIN
THROW 50000, '給与は負の値にできません。', 16;
END;
SELECT @salary;
END
BEGIN
DECLARE @salary DECIMAL(10,2);
SET @salary = -100;
IF @salary < 0
BEGIN
RAISERROR ('給与は負の値にできません。', 16, 1, 50000);
END;
SELECT @salary;
END
説明
- 両方の例では、
@salary
変数の値が負の場合、例外が発生します。 - 例 2 では、
RAISERROR
プロシージャを使用して同じ例外が再スローされます。
実行方法
これらの例を実行するには、SQL Server Management Studio などのツールを使用する必要があります。 コードをクエリ エディタに貼り付け、実行ボタンをクリックします。
SQL Server で同じ例外を再スローするその他の方法
TRY...CATCH
ブロックを使用すると、コードブロック内で発生する例外を処理できます。 例外を再スローするには、CATCH
ブロック内で THROW
キーワードを使用します。
BEGIN
DECLARE @salary DECIMAL(10,2);
SET @salary = -100;
BEGIN TRY
SELECT @salary;
END TRY
CATCH
THROW;
END
この例では、@salary
変数の値が負の場合、THROW
キーワードを使用して元の例外が再スローされます。
xEvents は、SQL Server でイベントを管理および追跡するための機能です。 xEvents を使用して例外をキャプチャし、再スローすることもできます。
CREATE EVENT TYPE MyException
ON FAILURE = RAISEERROR(50000, '例外が発生しました。', 16);
この例では、MyException
という名前の新しいイベント タイプが作成されます。 このイベントが発生すると、エラー番号 50000 とメッセージ "例外が発生しました。" を持つ例外が再スローされます。 重大度は 16 に設定されているため、これは重大なエラーとして扱われます。
TRY...CATCH
ブロックを使用する場合は、再スローする前に例外を処理する必要があります。- xEvents を使用するには、xEvents に関する基本的な知識が必要です。
SQL Server で同じ例外を再スローするには、さまざまな方法があります。 状況に応じて適切な方法を選択してください。
sql sql-server database