メイン画像

VBScript - エラー処理

VBScript - エラー処理


通常、スクリプトの実行中にエラーが起きた場合、エラーの内容が表示され、その時点でスクリプトは停止されます。

実行時エラーが起きた場合に独自の処理をしたいときは、エラー処理を有効にします。

エラー処理の有効化・無効化

エラー処理を有効にするには、On Error Resume Next ステートメントを使います。

また、有効にしたエラー処理を無効に戻すには On Error GoTo 0 ステートメントを使います。

On Error Resume Next と On Error GoTo 0 に囲まれた部分の処理は、実行時エラーが起きてもスクリプトは停止されません。

エラー情報を見て、適切なエラー処理を行う必要があります。

エラー情報(Err オブジェクト)の参照

実行時エラーの内容は Err オブジェクトに格納されます。

Err オブジェクトは以下のプロパティとメソッドを持ちます。

Number プロパティ
エラー番号。
正常なら 0 、異常なら 0 以外になります。
Description プロパティ
エラーの説明。
HelpFile プロパティ
ヘルプファイルのパス。
HelpContext プロパティ
ヘルプファイルのトピックを表すコンテキスト番号。
HelpFile プロパティを指定した場合、HelpContext プロパティで指定したトピックが自動的に表示されます。
Source プロパティ
エラーを最初に発生させたオブジェクトの名前。
Clear メソッド
Err オブジェクトが持つすべてのプロパティの値をクリアします。
Raise メソッド

実行時エラーを生成します。

Err.Raise number [, source] [, description] [, helpFile] [, helpContext]

number にはエラーの番号を Long 型の数値で指定します。
0 ~ 65535 の範囲が指定できます。
0 ~ 512 は VBScript の組み込みエラー、513 ~ はユーザー定義エラーとなります。

ユーザー定義エラーを設定するときは、エラー番号を定数 vbObjectError に追加します。
たとえば、エラー番号 1050 を発生させるには vbObjectError + 1050 をプロパティに設定します。

source にはエラーを生成したオブジェクトまたはアプリケーションの名前を指定します。
省略可能です。

description にはエラーの説明を指定します。
省略可能です。

helpFile にはヘルプファイルのパスを指定します。
省略可能です。

helpContext にはヘルプファイル内のトピックを識別するコンテキストIDを指定します。
省略可能です。

エラー処理の基本

On Error Resume Next ステートメントでエラー処理を有効にしたあとは、Err オブジェクトを見てエラーを処理します。

次のサンプルスクリプトは、ユーザーに入力された数値で 100 を割り、結果を表示します。
もし計算で何らかのエラーが起きた場合、エラー情報を通知して終了します。

Dim y
y = InputBox("100を割る数を入力してください")

'計算でエラーが起きる可能性があるので、エラー処理を有効にしておく
On Error Resume Next
Dim ret
ret = 100 / y
If Err.Number <> 0 Then
    WScript.Echo "Error # " & CStr(Err.Number) & " : " & Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

'計算結果を表示
WScript.Echo "100 ÷ " & y & " = " & ret

本当であればユーザー入力値をチェックするべきですが、まぁサンプルということで。

エラー処理の適用範囲

On Error Resume Next ステートメントで有効にしたエラー処理は、そのプロシージャ内でのみ有効になります。

エラー処理が無効なプロシージャ内で実行時エラーが発生した場合、エラー処理が有効なプロシージャまで処理が戻ります。
もしエラー処理が有効なプロシージャがなければ、そのままエラー情報が表示され、スクリプトは終了されます。

例1)エラー処理が有効なプロシージャからエラー処理が無効なプロシージャを呼び出した場合

FuncA → FuncB で呼び出し、FuncB で実行時エラーが起きた場合、FuncA まで処理が戻る。

'エラー処理が有効なプロシージャ FuncA
Sub FuncA
    On Error Resume Next

    Dim ret
    ret = FuncB
    'FuncB で実行エラーが起きた場合、ここ(FuncB を呼び出した行の次行)に処理が戻ってくる

    'エラー処理
    If Err.Number <> 0 Then
        WScript.Echo "Error # " & CStr(Err.Number) & " : " & Err.Description
        WScript.Quit 1
    End If
End Sub

'エラー処理が無効なプロシージャ FuncB
Function FuncB
    'ゼロ除算エラーを起こす
    FuncB = 100 / 0
End Function

例2)呼び出しの階層が深くなっても考え方は同じ

FuncA → FuncB → FuncC で呼び出し、FuncC で実行時エラーが起きた場合、FuncA まで処理が戻る。

'エラー処理が有効なプロシージャ FuncA
Sub FuncA
    On Error Resume Next

    Dim ret
    ret = FuncB
    'FuncB で実行エラーが起きた場合、ここ(FuncB を呼び出した行の次行)に処理が戻ってくる

    'エラー処理
    If Err.Number <> 0 Then
        WScript.Echo "Error # " & CStr(Err.Number) & " : " & Err.Description
        WScript.Quit 1
    End If
End Sub

'エラー処理が無効なプロシージャ FuncB
Function FuncB
    FuncB = FuncC
End Function

'エラー処理が無効なプロシージャ FuncC
Function FuncC
    'ゼロ除算エラーを起こす
    FuncC = 100 / 0
End Function

実行時エラーが起きた場合に、確実にユーザーへエラーを伝えるには次のようにするのが一番手軽な方法です。

  • エントリーポイントでのみ On Error Resume Next ステートメントでエラー処理を有効にする。
  • その他のプロシージャではエラー処理を有効にしない。
On Error Resume Next
Call Main
If Err.Number = 0 Then
    '正常終了
    WScript.Quit 0
Else
    '異常終了
    WScript.Echo "Error # " & CStr(Err.Number) & " : " & Err.Description
    WScript.Quit 1
End If
On Error GoTo 0

Sub Main
    'TODO: 処理を書く
End Sub

VBScript ではラベルによるエラー処理はできない

VBScript では VB6 や VBA にあるラベルによるエラー処理はできません。

以下のように「On Error GoTo 〈ラベル名〉」と指定して、エラー発生時に指定したラベルへ飛ばす書き方は不可能です。

On Error GoTo ErrHandler
    Dim ret
    ret = 100 / 0

    MsgBox ret

ExitHandler:
    Exit Sub
ErrHandler:
    MsgBox "Error # " & CStr(Err.Number) & " : " & Err.Description
    GoTo ExitHandler

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事