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

スポンサーリンク

VBScriptを掌握せよ:プロフェッショナルが辿り着く「堅牢なエラーハンドリング」の極意

VBScriptを「古い」「不安定」と切り捨てるのは、道具の真価を知らない者の戯言だ。Windowsの深層で動作するこの言語は、正しく設計すれば、数千行の自動化タスクを完遂する無敵の戦士となる。

しかし、多くの初心者が陥る罠がある。それは「エラー処理を後回しにする」ことだ。`On Error Resume Next` をただ呪文のように唱え、エラーを握りつぶして黙殺する――これこそが、保守不可能で「いつ爆発するか分からない」地雷コードを生む元凶である。

今日は、業務自動化の現場で「止まらないスクリプト」を構築するための、プロ仕様の例外処理アーキテクチャを伝授する。

1. 「エラーを無視する」という過ち

初心者はこう書く。

On Error Resume Next
‘ ファイル操作など
Set objFile = objFSO.OpenTextFile(“C:\test.txt”, 1)
‘ …以下、エラーが起きても無視して進む

これは罪だ。ファイルが存在しなかった場合、以降の処理はすべて「空のオブジェクト」を相手に暴走する。プロは、「エラーをトラップし、即座に封じ込め、安全にログを残して終了する」。これが鉄則だ。

2. 構造化エラーハンドリングの実装パターン

私が現場で用いるのは、サブルーチン単位でエラーを局所化し、統一されたログ出力関数へ流し込むスタイルだ。以下のコードは、そのままあなたのプロジェクトにコピー&ペーストして活用してほしい。

汎用エラーハンドリングの実装例

Option Explicit

‘ メイン処理の入り口
Main

Sub Main()
‘ 構造化の第一歩:エラー発生時にどこで止まったかを特定する
On Error Resume Next

‘ ここに業務ロジックを記述
Call ProcessFile(“C:\Target\data.txt”)

If Err.Number <> 0 Then
Call WriteLog(“Main”, “致命的なエラーが発生しました”)
End If
End Sub

‘ ファイル操作用のラップ関数
Sub ProcessFile(strPath)
On Error Resume Next ‘ このスコープ内でのエラーをトラップ

Dim fso, objFile
Set fso = CreateObject(“Scripting.FileSystemObject”)

Set objFile = fso.OpenTextFile(strPath, 1)

‘ エラーが発生したか確認
If Err.Number <> 0 Then
‘ エラー情報をログに渡す
Call WriteLog(“ProcessFile”, “エラーコード: ” & Err.Number & ” / 内容: ” & Err.Description & ” / ソース: ” & Err.Source)
‘ Errオブジェクトをクリアして、後続に影響を与えないようにする
Err.Clear
Exit Sub
End If

‘ 正常終了後の後始末
objFile.Close
Set objFile = Nothing
Set fso = Nothing
End Sub

‘ プロフェッショナルなログ出力関数
Sub WriteLog(strSource, strMsg)
Dim fso, logFile, logPath
logPath = “C:\Logs\app_error.log”

Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 追記モードでログを開く(存在しない場合は作成)
Set logFile = fso.OpenTextFile(logPath, 8, True)

logFile.WriteLine “[” & Now & “] [” & strSource & “] ” & strMsg
logFile.Close

Set logFile = Nothing
Set fso = Nothing
End Sub

3. なぜこの設計が「最強」なのか

このコードには、プロがコードを組む際の3つの思想が詰まっている。

1. Err.Clear の徹底: `Err` オブジェクトは静的である。エラーをキャッチした後にクリアしなければ、前のエラー情報が次の処理まで引き継がれ、デバッグを地獄に変える。
2. スコープの最小化: `On Error Resume Next` をスクリプトの先頭に書かないこと。関数やサブルーチン単位で限定的に適用することで、どこで何が起きたかをピンポイントで特定できる。
3. ログの標準化: エラー内容をコンソールに垂れ流すのではなく、ファイルに時刻付きで記録する。後から「昨日の夜、なぜツールが停止していたのか」を追跡できることは、業務自動化において最も重要な「信頼性」を担保する。

4. 現場で生き残るためのアドバイス

データベース連携やネットワークドライブ上のファイル操作を行う際、VBScriptはタイムアウトや接続断を頻繁に起こす。

  • リトライ処理の導入: エラーを検知したら即終了ではなく、ループを使って3回まで再試行するロジックを組み込むこと。
  • オブジェクトの解放: `Set obj = Nothing` を忘れるな。特にCOMオブジェクトはメモリリークを起こしやすい。エラー発生時でも必ず `Set = Nothing` が実行されるように、`Exit Sub` の前にクリーンアップ処理をまとめるのが腕の見せ所だ。

VBScriptは、シンプルであるがゆえに書き手の技量がそのまま露呈する言語だ。
エラーハンドリングを「面倒な作業」と捉えるか、「システムを堅牢にするための儀式」と捉えるか。その意識の差が、プロフェッショナルとただのスクリプトキディを分かつ境界線となる。

さあ、あなたのコードを今すぐ「落ちないコード」へと昇華させよ。健闘を祈る。

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