こんにちは。現場の最前線でコードと格闘している皆さん。
今日は、VB.NETの「死に様」について話をしましょう。
多くの開発者が、アプリケーションが予期せぬエラーで落ちた時、Windowsの無機質な「問題が発生したためプログラムを終了します」というダイアログをそのままユーザーに見せてしまっています。これでは、プロの仕事とは言えません。
一流のエンジニアは、「アプリは必ず落ちるもの」という前提で設計し、その最後をどう美しく演出するかを考えます。今回は、例外を握りつぶすのではなく、情報を吸い上げて「次に繋げる」ための防御的設計術を伝授します。
—
1. なぜ「2つの門番」が必要なのか?
VB.NETのアプリケーションには、例外をキャッチするための「2つの門番」が存在します。これらを正しく使い分けるのが第一歩です。
- Application.ThreadException: UIスレッド(ボタンを押した時など)で発生した例外を拾います。ここで止めれば、アプリは「生きながらえる」ことが可能です。
- AppDomain.UnhandledException: スレッドプールやバックグラウンド処理など、UIスレッド以外で発生した「避けられない死」を拾います。ここは「最後の遺言」を残すための場所です。
これらを「Program.vb」または「ApplicationEvents.vb」で統合管理するのが、プロの流儀です。
—
2. 現場で使える「クラッシュレポート・テンプレート」
さあ、実際にコードを書いてみましょう。この実装は、アプリがクラッシュした瞬間にスタックトレースを収集し、自動的にログを生成する仕組みです。
Imports System.Windows.Forms
Imports System.IO
Friend NotInheritable Class Program
Public Shared Sub Main()
‘ 1. UIスレッドの例外を捕捉
AddHandler Application.ThreadException, AddressOf Application_ThreadException
‘ 2. 全体的な例外(バックグラウンド等)を捕捉
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
Application.Run(New MainForm())
End Sub
‘ UIスレッド用:ユーザーに優しく通知し、可能なら続行させる
Private Shared Sub Application_ThreadException(sender As Object, e As ThreadExceptionEventArgs)
WriteLog(e.Exception)
MessageBox.Show(“予期せぬエラーが発生しました。開発チームにレポートを送信しました。”, “システムエラー”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Sub
‘ 全体用:ここはもう「死の直前」なので、ログを吐いて終了する
Private Shared Sub CurrentDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
WriteLog(TryCast(e.ExceptionObject, Exception))
‘ 終了前にプロセスを安全に閉じる処理が必要
Environment.Exit(1)
End Sub
‘ ログ出力の基本:環境情報もセットで残すのが鉄則
Private Shared Sub WriteLog(ex As Exception)
Dim path As String = “error_log.txt”
Dim logContent As String = $”[{DateTime.Now}] {vbCrLf}Message: {ex.Message}{vbCrLf}Stack: {ex.StackTrace}”
File.AppendAllText(path, logContent)
End Sub
End Class
—
3. 陥りやすい罠と対策
罠1:ログ書き込み中にエラーが起きる
ログを書き込むコード内でさらにエラーが起きると、無限ループやアプリの即死を招きます。ログ出力は「最もシンプルに、かつ失敗しない実装」を心がけてください。
罠2:機密情報の流出
スタックトレースには、時に接続文字列やユーザー名が含まれることがあります。サーバーへ送信する際は、必ずサニタイズ(個人情報の削除)を行うフィルターを通すのがエンジニアとしての良心です。
—
4. プロへのステップアップ:再起動の自動化
ただログを吐いて終わりではありません。本気でユーザー体験を考えるなら、「死んだ直後にアプリを再起動させる」ことも検討しましょう。
`Process.Start(Application.ExecutablePath)` を最後の最後に実行すれば、ユーザーは「あれ?一瞬固まった?」と思うだけで、作業を継続できるかもしれません。
—
先輩からのメッセージ
「例外処理」は、エラーを防ぐためのものではありません。「エラーが起きた後の振る舞い」をコントロールするためのものです。
VB.NETを使いこなすということは、こうした裏側のライフサイクルを支配することに他なりません。最初は難しく感じるかもしれませんが、この仕組みを一つ構築するだけで、あなたの作るアプリケーションの信頼性は劇的に向上します。
「動けばいい」コードから、「止まっても大丈夫な」設計へ。
一歩先へ進んだあなたなら、きっとできるはずです。また次回の講義で会いましょう!
