【実務・中級編】【HTAリッチエラーダイアログ】On Error 発生時にHTML Application(.hta)を動的作成して詳細スタックを表示する手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:致命的エラーを「資産」に変えるHTA動的デバッグUIの設計思想

業務自動化の世界において、スクリプトの「死」は突然訪れる。ユーザーの目の前で黒い画面が消滅し、背後で何が起きたのかも分からず、ただ「動きませんでした」という報告だけが届く——。これはエンジニアとして最も屈辱的な瞬間だ。

VBScriptの標準的な `MsgBox` は、もはやデバッグの道具としてはあまりに無力だ。今日は、エラーが発生した瞬間に「詳細なスタック情報とログ保存機能を持つHTA(HTML Application)を動的に召喚する」という、実務レベルで極めて強力な例外処理アーキテクチャを伝授する。

なぜ「標準のMsgBox」ではいけないのか

VBScriptの `Err` オブジェクトには、エラー番号と説明しかない。しかし、複雑化した業務システムでは「どこで」「どのようなスタック状態で」落ちたのかを知る必要がある。

`On Error Resume Next` を多用し、エラーを握りつぶして黙殺するコードは「技術的負債」の温床だ。エラーは隠すのではなく、「美しく提示し、即座に修正可能にする」のが、真のプロフェッショナルのあり方である。

HTA動的生成アーキテクチャの全容

この手法の肝は、「メインのスクリプトが死ぬ直前に、独立したプロセスとしてHTAウィンドウを起動し、そこに情報を流し込む」という設計にある。これにより、メイン環境がメモリリークや深刻な例外状態にあっても、エラー報告UIだけは確実にユーザーに提示できる。

実装:エラーハンドラ・ファクトリー

以下のコードは、エラー発生時に一時的なHTAファイルを作成・起動し、情報を表示するプロトタイプだ。

‘ — エラー発生時に呼び出すハンドラ関数 —
Sub ShowErrorDialog(errDesc, errNumber, errSource)
Dim fso, shell, tempFolder, htaPath, htaFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)

‘ 一時フォルダにHTAを生成
tempFolder = fso.GetSpecialFolder(2) ‘ Temporary Folder
htaPath = tempFolder & “\ErrorReport.hta”

‘ HTAのコンテンツを構築
Dim htmlContent
htmlContent = “致命的エラーが発生しました” & _
” & _

” & _

システムエラー

” & _

エラー内容: ” & errDesc & “
” & _
エラー番号: ” & errNumber & “
” & _
ソース: ” & errSource & “

” & _
” & _
“”

‘ ファイル書き込み
Set htaFile = fso.CreateTextFile(htaPath, True)
htaFile.Write htmlContent
htaFile.Close

‘ HTAを独立プロセスで実行
shell.Run “mshta.exe “”” & htaPath & “”””, 1, True

‘ 実行後に削除(ライフサイクル管理)
If fso.FileExists(htaPath) Then fso.DeleteFile htaPath
End Sub

‘ — 使用例 —
On Error Resume Next
‘ わざとエラーを発生させる
Dim x: x = 1 / 0
If Err.Number <> 0 Then
ShowErrorDialog Err.Description, Err.Number, Err.Source
WScript.Quit
End If

堅牢な設計のための3つの鉄則

この手法を本番環境で運用する際、以下の設計指針を忘れてはならない。

1. プロセスの分離と寿命管理

HTAは `mshta.exe` という独立したプロセスで動く。メインのWScriptプロセスが終了してもHTAは残り続けるため、最後に必ず `fso.DeleteFile` で一時ファイルをクリーンアップすること。これを怠ると、一時フォルダがジャンクで溢れ、パフォーマンス低下の要因となる。

2. 文字列エスケープの重要性

エラーメッセージには、パス名や特殊文字が含まれる可能性がある。HTMLとしてレンダリングする以上、`<` や `>` などの文字が含まれるとレイアウトが崩壊する。必要に応じて `Replace(str, “<", "<")` などの関数を噛ませる「サニタイズ処理」を忘れてはならない。

3. ログの保存先は「共有」を避ける

エラー詳細をファイルに書き出す際、ネットワークドライブ上の共有フォルダへ直接書き込むのは避けるべきだ。ネットワーク切断等の二次エラーで、肝心のエラーログが消える。まずはローカルの `AppData` 等へ出力し、その後、必要に応じて非同期でサーバーへ送信する設計が最も堅牢だ。

結びに代えて:自動化ツールの品格

自動化ツールは「動けばいい」というものではない。ユーザーがエラーに遭遇したとき、そのエラー画面がいかに丁寧で、次に何をすべきかが明記されているか。この「UXの細部」にこそ、エンジニアとしての品格が宿る。

今回紹介したHTA動的生成は、単なるデバッグ手法ではない。それは、複雑な自動化環境において、「システムに透明性を持たせるためのアーキテクチャ」である。ぜひ自身のプロジェクトに導入し、開発の質を一段上のレベルへ引き上げてほしい。

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