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
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?