【テクニカル・上級編】【エラーハンドリング】On Error Resume Next と Err オブジェクトによる堅牢な例外処理モジュールの構築 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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`への代入こそが、システムの長寿命化を約束する。
  • 例外を恐れるな。 正しいハンドリングさえあれば、どんな予期せぬエラーもシステムの「学習データ」に過ぎない。

このコードをあなたのシステムに実装した瞬間、それは単なるスクリプトから、堅牢な自動化エンジンへと進化する。健闘を祈る。

タイトルとURLをコピーしました