Try...Catch...Finally ステートメント (Visual Basic)
更新 : 2007 年 11 月
コードの実行中に、コードのブロックで発生する可能性のあるエラーの一部またはすべてを処理する方法を提供します。
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
指定項目
tryStatements
省略可能です。エラーが発生する可能性のあるステートメント。複合ステートメントを指定することもできます。Catch
省略可能です。複数の Catch ブロックを指定できます。Try ブロックの処理時に例外が発生した場合は、それぞれの Catch ステートメントがテキストの順序で評価され、その例外を処理できるかどうかが調べられます。このとき、スローされた例外は exception で表されます。exception
省略可能です。任意の変数名を指定します。exception の初期値は、スローされたエラーの値です。Catch と共に使用して、キャッチされたエラーを指定します。省略した場合、Catch ステートメントはどの例外でもキャッチします。type
省略可能です。クラス フィルタの種類を指定します。exception の値が type で指定した型、または派生した型の値と一致する場合は、その識別子が例外オブジェクトにバインドされます。When
省略可能です。Catch ステートメントに When 句が記述されている場合は、expression の評価が True になるときにのみ例外がキャッチされます。When 句は、例外の型をチェックした後にだけ適用されます。expression は、例外を表す識別子を参照することがあります。expression
省略可能です。暗黙的にブール型 (Boolean) に変換できる必要があります。汎用フィルタを記述する任意の式。通常、エラー番号によるフィルタ処理に使用されます。When キーワードと共に使用して、エラーがキャッチされる状況を指定します。catchStatements
省略可能です。関連付けられた Try ブロックで発生したエラーを処理するステートメントです。複合ステートメントを指定することもできます。Exit Try
省略可能です。Try...Catch...Finally 構造から抜けるためのキーワードです。End Try ステートメントのすぐ下にあるコードから実行が再開されます。その場合でも、Finally ステートメントは実行されます。Finally ブロック内には記述できません。Finally
省略可能です。Try ステートメントから抜けるときには、必ず Finally ブロックが実行されます。finallyStatements
省略可能です。他のエラー処理がすべて行われた後に実行されるステートメント。End Try
Try...Catch...Finally 構造の終わりを表します。
解説
Try ブロックと Catch ブロックは別々のブロックであるため、Try ブロック内のローカル変数を Catch ブロック内で使用することはできません。変数を複数のブロックで使用するには、その変数を Try...Catch...Finally 構造の外で宣言します。
Try ブロックにはエラーが発生する可能性のあるコードを記述し、Catch ブロックには発生したエラーを処理するコードを記述します。Try ブロックでエラーが発生すると、そのエラーの処理に適した Catch ステートメントにプログラムの制御が渡されます。exception 引数は、Exception クラスのインスタンス、つまり Exception クラスから派生したクラスです。Exception クラス インスタンスは、Try ブロックで発生したエラーに対応します。インスタンスには、エラーに関する情報が格納されています。これには、その数値とメッセージが含まれます。
Catch ステートメントは、exception 引数を指定しない場合、どのシステムまたはアプリケーションの例外でもキャッチします。これは、常に、Try...Catch...Finally 構造内で、期待する特定の例外すべてをキャッチした後の最後の Catch ブロックとして使用する必要があります。exception 引数がない場合、制御フローは、Catch の後の Catch ブロックに到達できません。
ネットワーク共有でホストされているアプリケーションなど、部分的に信頼されている状況では、Try...Catch...Finally はその呼び出しを含むメソッドが呼び出される前に発生したセキュリティ例外をキャッチしません。次のコード例をサーバー共有に配置し、そこから実行すると、"System.Security.SecurityException: 要求が失敗しました。" のエラーが発生します。セキュリティ例外の詳細については、SecurityException クラスの説明を参照してください。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Try
Process.Start("https://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
End Sub
このような部分的に信頼されている状況では、Process.Start ステートメントを別の Sub に入れる必要があります。Sub の最初の呼び出しは失敗します。これによって、Try...Catch は、Process.Start を含んでいる Sub が開始されてセキュリティ例外が生成される前に、その失敗をキャッチできます。
![]() |
---|
Try ステートメント内に Catch ブロックが 1 つもない場合は、Finally ブロックを含める必要があります。 |
使用例
次の簡単な例は、Try...Catch...Finally ステートメントの構造を示しています。
Public Sub TryExample()
Dim x As Integer = 5 ' Declare variables.
Dim y As Integer = 0
Try ' Set up structured error handling.
x = x \ y ' Cause a "Divide by Zero" error.
Catch ex As Exception When y = 0 ' Catch the error.
Beep()
MsgBox("You tried to divide by 0.") ' Show an explanatory message.
Finally
Beep() ' This line is executed no matter what.
End Try
End Sub