VBScriptを掌握せよ:Errオブジェクトを「解剖」し、真の障害追跡システムを構築する
VBScriptは、現代のモダンな言語と比較すれば確かに「枯れた」技術だ。しかし、Windows環境における自動化の現場において、これほど低コストで即座に成果を出せる武器は他にない。
だが、多くのエンジニアが犯す致命的なミスがある。それは、「エラーハンドリングを怠る」こと、そして「エラーを単なる番号としてしか捉えていない」ことだ。
本稿では、VBScriptにおける`Err`オブジェクトの全貌を暴き、あなたのスクリプトを「ブラックボックス」から「自己診断可能なプロフェッショナルなツール」へと昇華させるための極限の知見を授ける。
—
1. なぜ「On Error Resume Next」は諸刃の剣なのか
VBScriptでエラーを無視するために安易に`On Error Resume Next`を使うのは、時限爆弾を抱えて走るのと同じだ。エラーを無視すれば、後続の処理は「正常に動作しているフリ」をして、致命的なデータ破損を引き起こす。
真のエラーハンドリングとは、「エラーを隠蔽する」ことではなく、「エラーが起きた瞬間に、その状況を完璧にドキュメント化して捕獲する」ことにある。
2. Errオブジェクトを解剖する:真のログ収集術
`Err`オブジェクトは、エラーが発生した瞬間の「スナップショット」を保持している。我々がログに残すべきは、単なる`Err.Number`ではない。以下のプロパティを相関的に追跡することで、障害原因は瞬時に特定できる。
- Number: エラーコード。致命的な分岐の判断材料。
- Source: エラーの発生源。どのオブジェクト、どのDLLで起きたかを示す。
- Description: システムが提供するエラーメッセージ。
- HelpContext / HelpFile: ヘルプファイルが設定されている場合、解決のヒントとなる。
3. 実践:プロダクションコードに組み込む「エラー捕捉テンプレート」
以下は、私が大規模な業務自動化プロジェクトで標準採用しているエラーハンドリングの型だ。これを共通関数として持っておくだけで、保守性は劇的に向上する。
‘ ———————————————————
‘ 関数名: LogError
‘ 目的: Errオブジェクトの全情報を抽出し、ログファイルへ書き出す
‘ ———————————————————
Sub LogError(strContext)
Dim objFSO, objFile, strLogPath, strMessage
‘ ログ出力先(環境変数で制御するのがベスト)
strLogPath = “C:\Logs\AppError.log”
‘ エラー情報を整形
strMessage = Now & vbCrLf & _
“Context : ” & strContext & vbCrLf & _
“Number : ” & Err.Number & vbCrLf & _
“Source : ” & Err.Source & vbCrLf & _
“Description: ” & Err.Description & vbCrLf & _
“HelpFile : ” & Err.HelpFile & vbCrLf & _
“——————————————-” & vbCrLf
‘ ファイル追記モードでログ出力
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.OpenTextFile(strLogPath, 8, True) ‘ 8 = ForAppending
objFile.WriteLine(strMessage)
objFile.Close
‘ 後処理
Set objFile = Nothing
Set objFSO = Nothing
End Sub
‘ — 使用例:堅牢なファイル処理 —
On Error Resume Next
Dim fso, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set file = fso.OpenTextFile(“C:\Target.txt”, 1) ‘ 読み取り専用
If Err.Number <> 0 Then
‘ エラー発生!文脈を添えて記録する
LogError “ファイルをオープンできませんでした”
‘ 即座に終了、あるいは適切なロールバック処理へ
WScript.Quit(1)
End If
On Error GoTo 0 ‘ エラー監視を解除
4. 開発現場で生き残るための「三つの鉄則」
① 「Err.Clear」のタイミングを制御せよ
`Err`オブジェクトは自動的にはクリアされない。一つの処理ブロックが終わったら、次の監視のために必ず`Err.Clear`を実行する習慣をつけろ。さもなくば、前のエラーの残骸が次の処理を誤認させる。
② ソースコードに「文脈(Context)」を刻め
ログを見て「エラーコード: 70 (書き込み禁止)」とだけ書かれていても、どのファイル処理で落ちたのか分からなければ意味がない。`LogError`関数に引数として「どの処理を行っていたか」を文字列で渡すことが、障害対応時間を半分にする秘訣だ。
③ 外部リソース(DB/API)への接続は「二重防衛」せよ
データベースや外部APIと通信する場合、`Err`オブジェクトの監視だけでは不十分だ。タイムアウトやコネクション切断は、VBScriptのランタイムエラーとして即座に捕捉できない場合がある。接続確認用のPingや、`Connection.State`のチェックを併用し、多層的な防衛ラインを構築せよ。
—
最後に:なぜこれが必要なのか
技術の優劣は、言語そのものよりも「どれだけ運用コストを下げられる設計をしたか」で決まる。
エラーハンドリングを怠ったコードは、リリース後に開発者を地獄へ突き落とす。一方で、今回紹介した手法のように詳細なログを吐き出すコードは、「次に誰がメンテナンスしても、一瞬で原因に辿り着ける」という、エンジニアとしての究極の優しさを宿している。
VBScriptを使いこなすということは、こうした泥臭い泥沼をいかにスマートに回避するかを極めることに他ならない。さあ、あなたのコードを今すぐ「自律的なシステム」へと進化させてほしい。
