プロシージャにエラー処理を追加する場合は、エラーが発生した場合にプロシージャの実行をどのように制御するかを考慮する必要があります。 エラー処理ルーチンに実行の制御を渡すには、まずプロシージャになんらかの形式の On Error ステートメントを含めて、エラー処理ルーチンを有効にします。
On Error ステートメントは、エラーが発生した場合に実行の流れを制御します。
On Error ステートメントが含まれていない場合は、エラーが発生すると、単に実行が停止され、エラー メッセージが表示されるだけです。
Function MayCauseAnError()
' Enable error handler.
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Error_MayCauseAnError:
. ' Include code here to handle error.
.
.
End Function
On Error GoTo 0 ステートメントは、プロシージャ内でのエラー処理を無効にします。 このステートメントは、プロシージャに 0 という番号の行が含まれている場合でも、エラー処理コードの開始行として行 0 を指定しません。 コードに On Error GoTo 0 ステートメントが含まれていない場合は、プロシージャの実行が完了すると、エラー処理ルーチンは自動的に無効になります。
On Error GoTo 0 ステートメントは、 Err オブジェクトのプロパティをリセットするので、 Err オブジェクトの Clear メソッドと同じ効果があります。
On Error Resume Next ステートメントは、エラーの原因となった行を無視し、その次の行に実行の制御を移します。 実行は中断されません。 エラーが発生すると予想される行の直後に Err オブジェクトのプロパティをチェックし、エラー ハンドラーではなくプロシージャ内でエラーを処理する場合は、On Error Resume Next ステートメントを使用します。
Function MayCauseAnError()
' Enable error handler.
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Exit_MayCauseAnError:
Exit Function
Error_MayCauseAnError:
. ' Include code to handle error.
.
.
' Resume execution with exit routine to exit function.
Resume Exit_MayCauseAnError
End Function
入れ子になったプロシージャでのエラーの処理
有効なエラー ハンドラーを持たない入れ子になったプロシージャでエラーが発生すると、Visual Basic は、単に実行を停止するのではなく、別のプロシージャで有効なエラー ハンドラーの呼び出しリストを後方に検索します。 これにより、コードに別のプロシージャ内のエラーを修正する機会が提供されます。 たとえば、プロシージャ A がプロシージャ B を呼び出し、プロシージャ B がプロシージャ C を呼び出したとします。プロシージャ C でエラーが発生し、有効なエラー ハンドラーがない場合、Visual Basic は、有効なエラー ハンドラーのプロシージャ B、プロシージャ A をチェックします。 存在する場合、実行はそのエラー ハンドラーに渡されます。 そうでない場合は、実行が停止し、エラー メッセージが表示されます。
たとえば、プロシージャ C のエラー処理ルーチンが有効でも、発生したエラーを処理できないとします。 この場合、予期していたすべてのエラーをエラー処理ルーチンがチェックした後も、元のエラーが再度発生します。 その結果、プロシージャ B にエラー処理ルーチンがあると、実行の制御は、呼び出しリスト内の次のプロシージャ B に渡され、このエラー処理ルーチンがエラーを修正します。 プロシージャ B にエラー処理ルーチンがない場合、またはエラーを修正できず、そのエラーが再度発生する場合は、実行の制御は、プロシージャ A にエラー処理ルーチンがあれば、そのエラー処理ルーチンに渡されます。
Function MayCauseAnError()
' Declare constant to represent likely error.
Const conTypeMismatch As Integer = 13
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Exit_MayCauseAnError:
Exit Function
Error_MayCauseAnError:
' Check Err object properties.
If Err = conTypeMismatch Then
. ' Include code to handle error.
.
.
Else
' Regenerate original error.
Dim intErrNum As Integer
intErrNum = Err
Err.Clear
Err.Raise intErrNum
End If
' Resume execution with exit routine to exit function.
Resume Exit_MayCauseAnError
End Function