VBScriptを掌握する:エラーを「隠す」な、「構造化」して飼い慣らせ
こんにちは。業務自動化の現場でVBScriptと長年向き合ってきたエンジニアです。
VBScriptの世界に足を踏み入れた多くの人が、最初にぶつかる壁が「エラー処理」です。ネットで検索すると、すぐに目に入る `On Error Resume Next`。これを書けば確かにエラーで止まらなくなります。でも、それは「バグをゴミ箱に隠している」のと同じ。真のエンジニアは、エラーを「情報」として加工し、問題解決のヒントに変えます。
今回は、VBScriptの限界を突破し、まるでモダン言語のような「構造化エラー管理」を実現するテクニックを伝授します。
—
なぜ `On Error Resume Next` だけではダメなのか?
VBScriptには、C#やJavaのような `try-catch` ブロックが存在しません。そのため、エラーが発生すると即座にスクリプトが停止するか、あるいは `On Error Resume Next` で全てを無視して突き進むかの二択になりがちです。
しかし、大規模な自動化ツールを作る際、どこで、なぜ止まったのかが分からないのは致命的です。そこで今回は、エラー情報をオブジェクトとして保持し、スタックトレースを擬似再現する「ErrorManagerクラス」を構築します。
—
構造化エラー管理:カスタムエラークラスの実装
VBScriptで「クラス」を使うには、`Class` キーワードを使います。以下のコードをそのまま `.vbs` ファイルに貼り付けてみてください。
‘ エラー情報を保持するカスタムクラス
Class ErrorManager
Public Function CreateErrorInfo(errObj, contextName)
Dim info
‘ 構造化データとしてエラー内容を整形
info = “— ERROR REPORT —” & vbCrLf & _
“発生時刻: ” & Now & vbCrLf & _
“発生箇所: ” & contextName & vbCrLf & _
“エラー番号: ” & errObj.Number & vbCrLf & _
“エラー詳細: ” & errObj.Description & vbCrLf & _
“発生ソース: ” & errObj.Source & vbCrLf & _
“——————–”
CreateErrorInfo = info
End Function
End Class
‘ — 実装のデモンストレーション —
Dim ErrHandler : Set ErrHandler = New ErrorManager
Dim result
On Error Resume Next ‘ ここでエラーを捕まえる準備をする
‘ 意図的に0除算エラーを起こす
result = 10 / 0
If Err.Number <> 0 Then
‘ エラーが発生した場合のみ、情報を構造化して出力
WScript.Echo ErrHandler.CreateErrorInfo(Err, “MainFunction_Division”)
Err.Clear ‘ 最後に必ずクリアする(ここが重要!)
End If
このコードのポイント
1. `Err` オブジェクトの活用: VBScript実行環境が提供する組み込みオブジェクトから、詳細な情報を抜き出しています。
2. `contextName` の付与: 「どこで」起きたのかを関数名で渡すことで、ログの追跡性が劇的に向上します。
3. `Err.Clear`: エラーを処理した後は、必ずクリアすること。これを忘れると、別の処理でも「以前のエラー」を引きずってしまいます。
—
エラーを「飼い慣らす」ための3つの鉄則
初学者が陥りやすい罠を回避し、プロのレベルに到達するための心得です。
1. 「エラーを隠す」ための範囲は最小限にする
`On Error Resume Next` をスクリプトの冒頭に書くのはNGです。エラーが発生する可能性のある「特定の処理」の直前に書き、処理が終わったらすぐに `On Error GoTo 0`(エラー監視を標準に戻す)で解除してください。
2. ログを残す癖をつける
`WScript.Echo` は画面に出るだけです。実際の業務では、ファイルシステムオブジェクト(FSO)を使ってテキストファイルに追記するログ関数をこのクラスに追加しましょう。
3. 呼び出し元にエラーを伝播させる
関数Aが関数Bを呼び出すとき、関数Bで起きたエラーは関数Aに引き継ぐべきです。今回紹介したクラスを応用し、エラー情報を配列や辞書オブジェクト(Dictionary)で返すようにすると、より高度なエラーハンドリングが可能になります。
—
まとめ:ここをクリアすれば、あなたはもう脱・初心者
VBScriptは古い言語と言われますが、その仕組みを理解し、今回のような「構造化」のアプローチを取り入れることで、非常に堅牢な自動化ツールを作ることができます。
- エラーは無視せず、オブジェクトとして保持する
- 発生箇所(コンテキスト)を必ず記録する
- 処理後は必ず `Err.Clear` を叩く
この3つを守るだけで、あなたの書くスクリプトは劇的に「デバッグしやすく、運用に耐えるもの」へ進化します。
まずはこの `ErrorManager` を自分のツールに組み込んでみてください。エラーと正しく対話できるようになった時、あなたはVBScriptという言語を本当の意味で「掌握」できたと言えるはずです。
何か分からないことがあれば、いつでも聞いてくださいね。応援しています!
