On Error ステートメント (Visual Basic)
エラー処理ルーチンを有効にし、プロシージャ内のルーチンの場所を指定します。エラー処理ルーチンを無効にするためにも使用できます。 On Error
ステートメントは、非構造化エラー処理で使用し、構造化例外処理の代わりに使用できます。 構造化例外処理は .NET に組み込まれており、一般に効率的であるため、アプリケーションで実行時エラーを処理する場合に推奨されます。
エラー処理または例外処理を使用しない場合、発生したすべての実行時エラーが致命的になります。エラーメッセージが表示され、実行が停止します。
注意
Error
キーワードは、下位互換性のためにサポートされている Error ステートメントでも使用します。
構文
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
指定項目
用語 | 定義 |
---|---|
GoTo line |
必須の line 引数に指定された行から始まるエラー処理ルーチンを有効にします。 line 引数は、任意の行ラベルまたは行番号です。 実行時エラーが発生した場合、制御が指定された行に分岐し、エラー ハンドラーがアクティブになります。 指定した行は、On Error ステートメントと同じプロシージャ内に存在する必要があります。さもないと、コンパイル時エラーが発生します。 |
GoTo 0 |
現在のプロシージャで有効になっているエラー ハンドラーを無効にし、Nothing にリセットします。 |
GoTo -1 |
現在のプロシージャで有効になっている例外を無効にし、Nothing にリセットします。 |
Resume Next |
実行時エラーが発生したときに、エラーが発生したステートメントの直後のステートメントに制御を移動し、そのポイントから実行を続行することを指定します。 オブジェクトにアクセスする場合は、On Error GoTo ではなく、この形式を使用します。 |
Remarks
注意
コードでは、非構造化例外処理と On Error
ステートメントを使用するのではなく、可能な限り、構造化例外処理を使用することをお勧めします。 詳しくは、「Try...Catch...Finally ステートメント」をご覧ください。
"有効な" エラー ハンドラーは、On Error
ステートメントによって有効にされるものです。 "アクティブな" エラー ハンドラーは、エラーの処理中に有効にされているハンドラーです。
エラー ハンドラーがアクティブになっている間 (エラーの発生と、Resume
、Exit Sub
、Exit Function
、または Exit Property
ステートメントの間) にエラーが発生した場合、現在のプロシージャのエラー ハンドラーではエラーを処理できません。 呼び出し元のプロシージャに制御が戻ります。
呼び出し元のプロシージャに有効なエラー ハンドラーがある場合、エラーを処理するために、それがアクティブ化されます。 呼び出し元のプロシージャのエラー ハンドラーもアクティブな場合は、有効だが非アクティブなエラー ハンドラーが見つかるまで、前の呼び出し元プロシージャをさかのぼって、制御が戻されます。 そのようなエラー ハンドラーが見つからない場合、エラーは実際に発生した時点で致命的になります。
エラー ハンドラーによって呼び出し元のプロシージャに制御が戻されるたびに、そのプロシージャが現在のプロシージャになります。 いずれかのプロシージャのエラーハンドラーによってエラーが処理されると、Resume
ステートメントで指定されたポイントにある現在のプロシージャで、実行が再開されます。
注意
エラー処理ルーチンは、Sub
プロシージャや Function
プロシージャではありません。 それは、行ラベルまたは行番号でマークされたコードのセクションです。
Number プロパティ
エラー処理ルーチンでは、エラーの原因を特定するために、Err
オブジェクトの Number
プロパティの値に依存しています。 ルーチンでは、他のエラーが発生する可能性がある前、またはエラーが発生する可能性のあるプロシージャが呼び出される前に、Err
オブジェクトの関連するプロパティ値をテストまたは保存する必要があります。 Err
オブジェクトのプロパティ値は、最新のエラーだけを反映しています。 Err.Number
に関連付けられたエラー メッセージは Err.Description
に含まれています。
Throw ステートメント
Err.Raise
メソッドで発生したエラーによって、Exception
プロパティが Exception クラスの新しく作成されたインスタンスに設定されます。 派生した例外の種類の例外の発生をサポートするために、その言語で Throw
ステートメントがサポートされています。 これは、スローされる例外インスタンスである 1 つのパラメーターを受け取ります。 次の例に、これらの機能を既存の例外処理サポートと共に使用する方法を示しています。
On Error GoTo Handler
Throw New DivideByZeroException()
Handler:
If (TypeOf Err.GetException() Is DivideByZeroException) Then
' Code for handling the error is entered here.
End If
On Error GoTo
ステートメントでは、例外クラスに関係なく、すべてのエラーがトラップされることに注意してください。
On Error Resume Next
On Error Resume Next
によって、実行時エラーが発生したステートメントの直後のステートメント、または On Error Resume Next
ステートメントを含むプロシージャからの最新の呼び出しの直後のステートメントから、実行が続行されます。 このステートメントを使用すると、実行時エラーが発生しても実行を続行できます。 プロシージャ内の別の場所に制御を移すのではなく、エラーが発生しそうな場所に、エラー処理ルーチンを配置できます。 別のプロシージャが呼び出されると、On Error Resume Next
ステートメントは非アクティブになります。そのため、ルーチン内にエラー処理を埋め込む場合に、呼び出される各ルーチンで On Error Resume Next
ステートメントを実行する必要があります。
注意
他のオブジェクトへのアクセス中に生成されたエラーを処理する場合は、On Error Resume Next
コンストラクトの方が、On Error GoTo
より推奨されます。 オブジェクトの操作のたびに Err
をチェックすることで、コードによってアクセスされたオブジェクトについてのあいまいさがなくなります。 Err.Number
にエラーコードを配置したオブジェクトのほか、最初にエラーを生成したオブジェクト (Err.Source
に指定されたオブジェクト) を確認できます。
On Error GoTo 0
On Error GoTo 0
によって、現在のプロシージャのエラー処理が無効になります。 プロシージャに 0 番の行が含まれている場合でも、エラー処理コードの開始として行 0 は指定されません。 On Error GoTo 0
ステートメントを使用しない場合、プロシージャが終了すると、エラー ハンドラーが自動的に無効になります。
On Error GoTo -1
On Error GoTo -1
によって、現在のプロシージャの例外が無効になります。 プロシージャに -1 番の行が含まれている場合でも、エラー処理コードの開始として行 -1 は指定されません。 On Error GoTo -1
ステートメントを使用しない場合、プロシージャが終了すると、例外が自動的に無効になります。
エラーが発生しなかったときに、エラー処理コードが実行されないようにするには、次のフラグメントのように、エラー処理ルーチンの直前に、Exit Sub
、Exit Function
、または Exit Property
ステートメントを配置します。
Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
On Error GoTo ErrorHandler
' Insert code that might generate an error here
Exit Sub
ErrorHandler:
' Insert code to handle the error here
Resume Next
End Sub
ここで、エラー処理コードは、Exit Sub
ステートメントの後、End Sub
ステートメントの前に置いて、プロシージャ フローから分離します。 エラー処理コードは、プロシージャ内の任意の場所に配置できます。
トラップされないエラー
オブジェクトが実行可能ファイルとして実行されている場合に、オブジェクトのトラップされないエラーが制御元のアプリケーションに返されます。 開発環境では、適切なオプションが設定されている場合にのみ、トラップされないエラーが制御元のアプリケーションに返されます。 デバッグ時に設定すべきオプション、それらの設定方法、およびホストでクラスを作成できるかどうかの説明については、ホスト アプリケーションのドキュメントを参照してください。
他のオブジェクトにアクセスするオブジェクトを作成する場合は、返されたハンドルされないエラーの処理を試みる必要があります。 できない場合、Err.Number
のエラー コードを独自のエラーのいずれかにマップし、次にそれらをオブジェクトの呼び出し元に渡します。 独自のエラーを指定するには、エラー コードを VbObjectError
定数に追加します。 たとえば、エラー コードが 1052 の場合は、それを次のように割り当てます。
Err.Number = vbObjectError + 1052
注意事項
Windows ダイナミックリンク ライブラリ (DLL) の呼び出し時のシステム エラーでは、例外が発生せず、Visual Basic エラー トラップでトラップできません。 DLL 関数を呼び出すときは、API 仕様に従って、各戻り値の成功または失敗を確認し、失敗の場合は Err
オブジェクトの LastDLLError
プロパティの値を確認する必要があります。
例
この例では、最初に On Error GoTo
ステートメントを使用して、プロシージャ内のエラー処理ルーチンの場所を指定しています。 例では、0 で除算しようとしてエラー番号 6 が生成されます。 エラー処理ルーチンでエラーが処理され、エラーが発生したステートメントに制御が返されます。 On Error GoTo 0
ステートメントによって、エラー トラップがオフになります。 さらに、次のステートメントによって生成されるエラーのコンテキストを確実に認識できるように、On Error Resume Next
ステートメントを使用して、エラー トラップを遅延します。 Err.Clear
を使用して、エラーが処理された後に Err
オブジェクトのプロパティがクリアされていることに注目してください。
Public Sub OnErrorDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
On Error GoTo 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
z = x / y ' Creates a divide by zero error again
If Err.Number = 6 Then
' Tell user what happened. Then clear the Err object.
Dim Msg As String
Msg = "There was an error attempting to divide by zero!"
MsgBox(Msg, , "Divide by zero error")
Err.Clear() ' Clear Err object fields.
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 6 ' Divide by zero error
MsgBox("You attempted to divide by zero!")
' Insert code to handle this error
Case Else
' Insert code to handle other situations here...
End Select
Resume Next ' Resume execution at the statement immediately
' following the statement where the error occurred.
End Sub
要件
名前空間: Microsoft.VisualBasic
アセンブリ: Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll)
関連項目
.NET