VBScriptを掌握する極限の知見:堅牢なエラーハンドリングの構築
VBScriptは、現代のモダンな開発言語と比較すれば「不自由な言語」に見えるかもしれない。しかし、その本質は「OSの深部を直感的に操るための最小単位のインターフェース」にある。
多くのエンジニアが陥る罠は、`On Error Resume Next`を「エラーを無視する魔法」と勘違いすることだ。これはプログラミングではない。ただの思考停止だ。真のアーキテクトは、このステートメントを「例外を制御可能なオブジェクトへ変換するトリガー」として利用する。
本稿では、レガシー環境においてもシステム停止を許さない、プロフェッショナルなエラーハンドリング・モジュールの構築理論を伝授する。
—
1. エラーハンドリングの哲学:黙らせるな、飼いならせ
VBScriptにはJavaやC#のような洗練された`try-catch`ブロックは存在しない。しかし、`Err`オブジェクトは、実行時エラーが発生した瞬間に、その詳細をメモリ上の構造体として保持する。
我々がやるべきは、「エラーをトラップし、必要な情報を抽出した直後にErrオブジェクトを消去(Clear)し、処理のフローを健全な状態へ戻す」ことである。
プロフェッショナルなエラーハンドリングの基本構造
‘ エラーハンドリングの定石
On Error Resume Next ‘ 制御をハンドラへ移譲
‘ [リスクのある処理]
Call ExecuteCriticalOperation()
If Err.Number <> 0 Then
‘ ここで例外をキャプチャし、構造化ログへ出力
Call LogError(Err.Source, Err.Number, Err.Description)
‘ 必ず消去する。これを怠ると、次の処理で古いエラーが残る「幽霊エラー」を引き起こす
Err.Clear
End If
On Error GoTo 0 ‘ 制御をデフォルト(異常終了)に戻す
—
2. 独自ログ出力モジュールの実装
単にエラーを吐くだけでは保守はできない。発生源、エラー番号、そして発生時刻。これらがセットになって初めて「運用ログ」として機能する。
実践的なエラーロギング関数
Sub LogError(source, number, description)
Dim fso, logFile, ts
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ パフォーマンスへの配慮:ログファイルへの追記モードで開く
‘ 頻繁に開閉するとI/O負荷が高まるため、必要最小限のタイミングで接続
Set ts = fso.OpenTextFile(“C:\Logs\SystemError.log”, 8, True)
ts.WriteLine “[” & Now & “] Source: ” & source & ” | ErrNo: ” & number & ” | Desc: ” & description
ts.Close
‘ メモリ最適化:オブジェクトの明示的解放
‘ VBScriptのガベージコレクションを待つな。リソースは自ら解放せよ
Set ts = Nothing
Set fso = Nothing
End Sub
—
3. 極限の知見:なぜ「Set = Nothing」が必要なのか
VBScriptが動作するWSH環境(wscript.exe / cscript.exe)は、プロセス終了までメモリを保持し続ける傾向がある。特にCOMオブジェクト(`Excel.Application`や`ADODB.Connection`など)を多用する場合、`Set = Nothing`を怠ると、メモリリークだけでなく、バックグラウンドでExcel等のプロセスがゾンビとして残り続け、次回の実行を阻害する。
「使用後は即座に開放する」。これがレガシー環境を長年安定稼働させるための、唯一にして絶対の鉄則だ。
—
4. 堅牢な例外処理モジュールの統合案
実務では、エラー処理を共通関数化し、処理の入り口と出口で確実に制御をかけることが重要だ。
‘ メイン実行部
Sub Main()
On Error Resume Next
‘ データベース接続処理などの重い処理をラップする
Dim result
result = ConnectToDatabase()
If Err.Number <> 0 Then
Call LogError(“Main”, Err.Number, “DB接続失敗: ” & Err.Description)
Err.Clear
Exit Sub ‘ 安全な早期リターン
End If
‘ 以降、正常系処理
‘ …
On Error GoTo 0
End Sub
—
5. 最後に:アーキテクトとしての矜持
VBScriptを書くということは、枯れた技術を相手にするということだ。しかし、枯れているということは「予測可能である」という大きな利点でもある。
- エラーは隠蔽しない。 ログとして可視化し、分析可能にする。
- リソースは放置しない。 明示的な`Nothing`への代入こそが、システムの長寿命化を約束する。
- 例外を恐れるな。 正しいハンドリングさえあれば、どんな予期せぬエラーもシステムの「学習データ」に過ぎない。
このコードをあなたのシステムに実装した瞬間、それは単なるスクリプトから、堅牢な自動化エンジンへと進化する。健闘を祈る。
