On Error ステートメント (Visual Basic)On Error Statement (Visual Basic)

エラー処理ルーチンを有効にし、プロシージャ内のルーチンの場所を指定します。エラー処理ルーチンを無効にするためにも使用できます。Enables an error-handling routine and specifies the location of the routine within a procedure; can also be used to disable an error-handling routine. On Error ステートメントは、非構造化エラー処理で使用し、構造化例外処理の代わりに使用できます。The On Error statement is used in unstructured error handling and can be used instead of structured exception handling. 構造化例外処理は .NET に組み込まれており、一般に効率的であるため、アプリケーションで実行時エラーを処理する場合に推奨されます。Structured exception handling is built into .NET, is generally more efficient, and so is recommended when handling runtime errors in your application.

エラー処理または例外処理を使用しない場合、発生したすべての実行時エラーが致命的になります。エラーメッセージが表示され、実行が停止します。Without error handling or exception handling, any run-time error that occurs is fatal: an error message is displayed, and execution stops.

注意

Error キーワードは、下位互換性のためにサポートされている Error ステートメントでも使用します。The Error keyword is also used in the Error Statement, which is supported for backward compatibility.

構文Syntax

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

指定項目Parts

用語Term 定義Definition
GoTo lineGoTo line 必須の line 引数に指定された行から始まるエラー処理ルーチンを有効にします。Enables the error-handling routine that starts at the line specified in the required line argument. line 引数は、任意の行ラベルまたは行番号です。The line argument is any line label or line number. 実行時エラーが発生した場合、制御が指定された行に分岐し、エラー ハンドラーがアクティブになります。If a run-time error occurs, control branches to the specified line, making the error handler active. 指定した行は、On Error ステートメントと同じプロシージャ内に存在する必要があります。さもないと、コンパイル時エラーが発生します。The specified line must be in the same procedure as the On Error statement or a compile-time error will occur.
GoTo 0 現在のプロシージャで有効になっているエラー ハンドラーを無効にし、Nothing にリセットします。Disables enabled error handler in the current procedure and resets it to Nothing.
GoTo -1 現在のプロシージャで有効になっている例外を無効にし、Nothing にリセットします。Disables enabled exception in the current procedure and resets it to Nothing.
Resume Next 実行時エラーが発生したときに、エラーが発生したステートメントの直後のステートメントに制御を移動し、そのポイントから実行を続行することを指定します。Specifies that when a run-time error occurs, control goes to the statement immediately following the statement where the error occurred, and execution continues from that point. オブジェクトにアクセスする場合は、On Error GoTo ではなく、この形式を使用します。Use this form rather than On Error GoTo when accessing objects.

RemarksRemarks

注意

コードでは、非構造化例外処理と On Error ステートメントを使用するのではなく、可能な限り、構造化例外処理を使用することをお勧めします。We recommend that you use structured exception handling in your code whenever possible, rather than using unstructured exception handling and the On Error statement. 詳しくは、「Try...Catch...Finally ステートメント」をご覧ください。For more information, see Try...Catch...Finally Statement.

"有効な" エラー ハンドラーは、On Error ステートメントによって有効にされるものです。An "enabled" error handler is one that is turned on by an On Error statement. "アクティブな" エラー ハンドラーは、エラーの処理中に有効にされているハンドラーです。An "active" error handler is an enabled handler that is in the process of handling an error.

エラー ハンドラーがアクティブになっている間 (エラーの発生と、ResumeExit SubExit Function、または Exit Property ステートメントの間) にエラーが発生した場合、現在のプロシージャのエラー ハンドラーではエラーを処理できません。If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure's error handler cannot handle the error. 呼び出し元のプロシージャに制御が戻ります。Control returns to the calling procedure.

呼び出し元のプロシージャに有効なエラー ハンドラーがある場合、エラーを処理するために、それがアクティブ化されます。If the calling procedure has an enabled error handler, it is activated to handle the error. 呼び出し元のプロシージャのエラー ハンドラーもアクティブな場合は、有効だが非アクティブなエラー ハンドラーが見つかるまで、前の呼び出し元プロシージャをさかのぼって、制御が戻されます。If the calling procedure's error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. そのようなエラー ハンドラーが見つからない場合、エラーは実際に発生した時点で致命的になります。If no such error handler is found, the error is fatal at the point at which it actually occurred.

エラー ハンドラーによって呼び出し元のプロシージャに制御が戻されるたびに、そのプロシージャが現在のプロシージャになります。Each time the error handler passes control back to a calling procedure, that procedure becomes the current procedure. いずれかのプロシージャのエラーハンドラーによってエラーが処理されると、Resume ステートメントで指定されたポイントにある現在のプロシージャで、実行が再開されます。Once an error is handled by an error handler in any procedure, execution resumes in the current procedure at the point designated by the Resume statement.

注意

エラー処理ルーチンは、Sub プロシージャや Function プロシージャではありません。An error-handling routine is not a Sub procedure or a Function procedure. それは、行ラベルまたは行番号でマークされたコードのセクションです。It is a section of code marked by a line label or a line number.

Number プロパティNumber Property

エラー処理ルーチンでは、エラーの原因を特定するために、Err オブジェクトの Number プロパティの値に依存しています。Error-handling routines rely on the value in the Number property of the Err object to determine the cause of the error. ルーチンでは、他のエラーが発生する可能性がある前、またはエラーが発生する可能性のあるプロシージャが呼び出される前に、Err オブジェクトの関連するプロパティ値をテストまたは保存する必要があります。The routine should test or save relevant property values in the Err object before any other error can occur or before a procedure that might cause an error is called. Err オブジェクトのプロパティ値は、最新のエラーだけを反映しています。The property values in the Err object reflect only the most recent error. Err.Number に関連付けられたエラー メッセージは Err.Description に含まれています。The error message associated with Err.Number is contained in Err.Description.

Throw ステートメントThrow Statement

Err.Raise メソッドで発生したエラーによって、Exception プロパティが Exception クラスの新しく作成されたインスタンスに設定されます。An error that is raised with the Err.Raise method sets the Exception property to a newly created instance of the Exception class. 派生した例外の種類の例外の発生をサポートするために、その言語で Throw ステートメントがサポートされています。In order to support the raising of exceptions of derived exception types, a Throw statement is supported in the language. これは、スローされる例外インスタンスである 1 つのパラメーターを受け取ります。This takes a single parameter that is the exception instance to be thrown. 次の例に、これらの機能を既存の例外処理サポートと共に使用する方法を示しています。The following example shows how these features can be used with the existing exception handling support:

    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 ステートメントでは、例外クラスに関係なく、すべてのエラーがトラップされることに注意してください。Notice that the On Error GoTo statement traps all errors, regardless of the exception class.

On Error Resume NextOn Error Resume Next

On Error Resume Next によって、実行時エラーが発生したステートメントの直後のステートメント、または On Error Resume Next ステートメントを含むプロシージャからの最新の呼び出しの直後のステートメントから、実行が続行されます。On Error Resume Next causes execution to continue with the statement immediately following the statement that caused the run-time error, or with the statement immediately following the most recent call out of the procedure containing the On Error Resume Next statement. このステートメントを使用すると、実行時エラーが発生しても実行を続行できます。This statement allows execution to continue despite a run-time error. プロシージャ内の別の場所に制御を移すのではなく、エラーが発生しそうな場所に、エラー処理ルーチンを配置できます。You can place the error-handling routine where the error would occur rather than transferring control to another location within the procedure. 別のプロシージャが呼び出されると、On Error Resume Next ステートメントは非アクティブになります。そのため、ルーチン内にエラー処理を埋め込む場合に、呼び出される各ルーチンで On Error Resume Next ステートメントを実行する必要があります。An On Error Resume Next statement becomes inactive when another procedure is called, so you should execute an On Error Resume Next statement in each called routine if you want inline error handling within that routine.

注意

他のオブジェクトへのアクセス中に生成されたエラーを処理する場合は、On Error Resume Next コンストラクトの方が、On Error GoTo より推奨されます。The On Error Resume Next construct may be preferable to On Error GoTo when handling errors generated during access to other objects. オブジェクトの操作のたびに Err をチェックすることで、コードによってアクセスされたオブジェクトについてのあいまいさがなくなります。Checking Err after each interaction with an object removes ambiguity about which object was accessed by the code. Err.Number にエラーコードを配置したオブジェクトのほか、最初にエラーを生成したオブジェクト (Err.Source に指定されたオブジェクト) を確認できます。You can be sure which object placed the error code in Err.Number, as well as which object originally generated the error (the object specified in Err.Source).

On Error GoTo 0On Error GoTo 0

On Error GoTo 0 によって、現在のプロシージャのエラー処理が無効になります。On Error GoTo 0 disables error handling in the current procedure. プロシージャに 0 番の行が含まれている場合でも、エラー処理コードの開始として行 0 は指定されません。It doesn't specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. On Error GoTo 0 ステートメントを使用しない場合、プロシージャが終了すると、エラー ハンドラーが自動的に無効になります。Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

On Error GoTo -1On Error GoTo -1

On Error GoTo -1 によって、現在のプロシージャの例外が無効になります。On Error GoTo -1 disables the exception in the current procedure. プロシージャに -1 番の行が含まれている場合でも、エラー処理コードの開始として行 -1 は指定されません。It does not specify line -1 as the start of the error-handling code, even if the procedure contains a line numbered -1. On Error GoTo -1 ステートメントを使用しない場合、プロシージャが終了すると、例外が自動的に無効になります。Without an On Error GoTo -1 statement, an exception is automatically disabled when a procedure is exited.

エラーが発生しなかったときに、エラー処理コードが実行されないようにするには、次のフラグメントのように、エラー処理ルーチンの直前に、Exit SubExit Function、または Exit Property ステートメントを配置します。To prevent error-handling code from running when no error has occurred, place an Exit Sub, Exit Function, or Exit Property statement immediately before the error-handling routine, as in the following fragment:

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 ステートメントの前に置いて、プロシージャ フローから分離します。Here, the error-handling code follows the Exit Sub statement and precedes the End Sub statement to separate it from the procedure flow. エラー処理コードは、プロシージャ内の任意の場所に配置できます。You can place error-handling code anywhere in a procedure.

トラップされないエラーUntrapped Errors

オブジェクトが実行可能ファイルとして実行されている場合に、オブジェクトのトラップされないエラーが制御元のアプリケーションに返されます。Untrapped errors in objects are returned to the controlling application when the object is running as an executable file. 開発環境では、適切なオプションが設定されている場合にのみ、トラップされないエラーが制御元のアプリケーションに返されます。Within the development environment, untrapped errors are returned to the controlling application only if the proper options are set. デバッグ時に設定すべきオプション、それらの設定方法、およびホストでクラスを作成できるかどうかの説明については、ホスト アプリケーションのドキュメントを参照してください。See your host application's documentation for a description of which options should be set during debugging, how to set them, and whether the host can create classes.

他のオブジェクトにアクセスするオブジェクトを作成する場合は、返されたハンドルされないエラーの処理を試みる必要があります。If you create an object that accesses other objects, you should try to handle any unhandled errors they pass back. できない場合、Err.Number のエラー コードを独自のエラーのいずれかにマップし、次にそれらをオブジェクトの呼び出し元に渡します。If you cannot, map the error codes in Err.Number to one of your own errors and then pass them back to the caller of your object. 独自のエラーを指定するには、エラー コードを VbObjectError 定数に追加します。You should specify your error by adding your error code to the VbObjectError constant. たとえば、エラー コードが 1052 の場合は、それを次のように割り当てます。For example, if your error code is 1052, assign it as follows:

Err.Number = vbObjectError + 1052

注意事項

Windows ダイナミックリンク ライブラリ (DLL) の呼び出し時のシステム エラーでは、例外が発生せず、Visual Basic エラー トラップでトラップできません。System errors during calls to Windows dynamic-link libraries (DLLs) do not raise exceptions and cannot be trapped with Visual Basic error trapping. DLL 関数を呼び出すときは、API 仕様に従って、各戻り値の成功または失敗を確認し、失敗の場合は Err オブジェクトの LastDLLError プロパティの値を確認する必要があります。When calling DLL functions, you should check each return value for success or failure (according to the API specifications), and in the event of a failure, check the value in the Err object's LastDLLError property.

Example

この例では、最初に On Error GoTo ステートメントを使用して、プロシージャ内のエラー処理ルーチンの場所を指定しています。This example first uses the On Error GoTo statement to specify the location of an error-handling routine within a procedure. 例では、0 で除算しようとしてエラー番号 6 が生成されます。In the example, an attempt to divide by zero generates error number 6. エラー処理ルーチンでエラーが処理され、エラーが発生したステートメントに制御が返されます。The error is handled in the error-handling routine, and control is then returned to the statement that caused the error. On Error GoTo 0 ステートメントによって、エラー トラップがオフになります。The On Error GoTo 0 statement turns off error trapping. さらに、次のステートメントによって生成されるエラーのコンテキストを確実に認識できるように、On Error Resume Next ステートメントを使用して、エラー トラップを遅延します。Then the On Error Resume Next statement is used to defer error trapping so that the context for the error generated by the next statement can be known for certain. Err.Clear を使用して、エラーが処理された後に Err オブジェクトのプロパティがクリアされていることに注目してください。Note that Err.Clear is used to clear the Err object's properties after the error is handled.

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

必要条件Requirements

名前空間: Microsoft.VisualBasicNamespace: Microsoft.VisualBasic

アセンブリ: Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll)Assembly: Visual Basic Runtime Library (in Microsoft.VisualBasic.dll)

関連項目See also