VBScriptを「使い捨て」で終わらせない:構造化エラー管理による堅牢な自動化基盤の構築
業務自動化の世界で、VBScriptは今なお強力な武器だ。だが、多くの現場でこの言語が「負の遺産」と化している理由は明白だ。`On Error Resume Next`という名の「責任放棄」が蔓延しているからだ。
エラーを無視して処理を続行すれば、ログには何も残らず、原因不明のままデータだけが破壊される。本稿では、VBScriptの限界を突破し、プロフェッショナルな現場で通用する「構造化エラー管理」の設計思想を授ける。
—
なぜ `On Error Resume Next` は「毒」なのか
初心者はこれを「安全策」だと勘違いする。だが、これは「バグを隠蔽するための麻酔」に過ぎない。エラーを握りつぶした瞬間、プログラムは「何が起きたか」という貴重なコンテキストを失う。
堅牢な自動化ツールを作るなら、「エラーは即座に補足し、コンテキストと共にパッケージ化して記録する」という原則を徹底せねばならない。
—
独自エラー管理クラス:`ErrorManager` の設計
VBScriptにはスタックトレース機能がない。だからこそ、我々エンジニアが手動でスタックを模倣し、情報を保持するオブジェクトを構築する必要がある。
以下に、実務でそのまま導入可能なプロダクションコードを提示する。
実装コード:`ErrorManager.vbs`
‘ エラー情報を保持するコンテナクラス
Class ErrorManager
Public Function CreateReport(errObj, funcName)
Dim msg
‘ エラー情報を構造化して文字列化する
msg = “— [ERROR REPORT] —” & vbCrLf & _
“発生時刻: ” & Now & vbCrLf & _
“発生場所: ” & funcName & vbCrLf & _
“エラー番号: ” & errObj.Number & vbCrLf & _
“エラー説明: ” & errObj.Description & vbCrLf & _
“発生元: ” & errObj.Source & vbCrLf & _
“———————–”
‘ ログファイルへの書き込み(WScript.Shellの使用を推奨)
WriteLog msg
‘ コンテキストを保持したまま例外を再送出(あるいは適切に終了)
Err.Clear
CreateReport = msg
End Function
Private Sub WriteLog(msg)
Dim fso, ts
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 追記モードでログ出力。パスは適宜調整のこと
Set ts = fso.OpenTextFile(“C:\Logs\app_error.log”, 8, True)
ts.WriteLine msg
ts.Close
End Sub
End Class
‘ — 利用例 —
Dim em: Set em = New ErrorManager
Sub ProcessData()
On Error Resume Next ‘ 局所的にのみ使用し、即座に評価する
‘ 何らかの危険な処理(例:ファイルオープン)
Dim fso: Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.OpenTextFile “C:\NonExistent.txt”
If Err.Number <> 0 Then
‘ エラー発生箇所を明示的に渡す
MsgBox em.CreateReport(Err, “ProcessData”)
Exit Sub
End If
On Error GoTo 0
End Sub
—
運用の極意:保守性を高める3つの鉄則
コードをコピペするだけでは不十分だ。エンジニアとして、次の設計思想を常に意識してほしい。
1. 「エラーの局所化」を徹底せよ
`On Error Resume Next` は、関数全体の先頭に置くものではない。「エラーが予測される特定の行」の直前でのみ有効にし、直後に `If Err.Number <> 0` で判定を行う。 これにより、意図しないエラーを隠蔽するリスクを完全に排除できる。
2. ファイルシステムとデータベースの連携には「排他制御」を
自動化ツールがファイルやDBに書き込む際、エラーの多くは「ロック」に起因する。上記クラスに加えて、リトライ処理(ループを用いた待機)を実装すること。ただエラーを吐くのではなく、「リトライした結果、それでもダメだった」という情報をログに残すのがプロの仕事だ。
3. スタックトレースの擬似再現(再帰的ハンドリング)
複雑な処理の場合、関数Aから関数Bを呼び出す。その際、各関数でエラーを補足し、上位へ情報を伝える「エラーの連鎖」を意識せよ。
- 下位層で `errObj.Description` を取得
- 上位層へ伝播させ、より大きなコンテキスト(「どの処理の一部か」)を追記する。
—
最後に:VBScriptを馬鹿にするな
VBScriptは古い言語かもしれない。しかし、そのシンプルさゆえに、書き手の「構造化への意識」がダイレクトに品質として現れる言語でもある。
「動けばいい」というコードは、一ヶ月後の自分を殺すことになる。本稿で紹介した `ErrorManager` のような、エラーを可視化する仕組みを導入することで、あなたの自動化ツールは「使い捨て」から「資産」へと進化するはずだ。
堅牢な設計は、技術力の証明そのものだ。さあ、今すぐ既存のスクリプトをリファクタリングし、エラーを飼い慣らす環境を整えてほしい。
