堅牢な業務アプリの境界線:VB.NETにおける「正しい例外処理」と「沈黙させないログ」の極意
業務自動化ツールを開発する際、多くの初心者が陥る罠がある。それは「動けばいい」という甘えによる、無防備なコードだ。
「エラーが出たら止まる」のは当たり前だが、「エラーが出ても、システムが何事もなかったかのように安全に終了し、管理者に的確な遺言を残す」ことこそが、プロの書くVB.NETのコードだ。
今日は、現場で生き残るための「例外処理の作法」を伝授する。
—
1. 「Try-Catch」の正しい哲学:すべてを包むな
初心者はよく、コード全体を一つの大きな `Try-Catch` で囲む。これは「腹痛も頭痛も骨折も、全部同じ薬で治そうとする」に等しい愚行だ。
非推奨な書き方(アンチパターン)
‘ 全部囲んでしまうと、どこで何が起きたか特定できない
Try
‘ ファイル読み込み
‘ DB書き込み
‘ 計算処理
Catch ex As Exception
MsgBox(“エラーです”) ‘ これではユーザーも開発者も救われない
End Try
プロの設計:粒度を分ける
例外処理は「回復可能な処理」と「回復不可能な処理」を明確に分ける。
‘ 【推奨】処理ごとにTryを分割し、責任範囲を明確にする
Try
‘ ファイルIOは独立させる
ReadFile()
Catch ex As System.IO.IOException
‘ ここでログを吐いて、ユーザーに「ファイルが見つかりません」と通知する
End Try
Try
‘ DB接続も独立させる
UpdateDatabase()
Catch ex As System.Data.SqlClient.SqlException
‘ DB特有のエラーハンドリングを行う
End Try
—
2. ログ出力の基本:ログは「遺言」である
エラーが発生した際、何が起きたかを記録せずに握りつぶすのは、事故現場で証拠隠滅するのと同じだ。最低限、以下の情報は残せ。
1. タイムスタンプ(いつ)
2. 例外メッセージ(何が起きたか)
3. スタックトレース(コードのどこで起きたか)
現場でそのまま使えるログ出力メソッド
Imports System.IO
Public Sub WriteErrorLog(ex As Exception)
Dim logPath As String = “C:\Logs\app_error.log”
Dim logMessage As String = String.Format(
“{0} | ERROR: {1} | STACKTRACE: {2}{3}”,
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”),
ex.Message,
ex.StackTrace,
Environment.NewLine
)
‘ ファイルを追記モードで開く
‘ 複数人/複数プロセスで競合しないよう注意が必要だが、まずはここから
File.AppendAllText(logPath, logMessage)
End Sub
—
3. Finallyの使い所:リソース解放の絶対ルール
VB.NETでは、ファイルやDB接続、ネットワーク通信など「外部リソース」を使用した場合、どんなエラーが起きても必ず解放(Dispose)しなければならない。これを怠ると、ツールがメモリリークを起こし、PC全体のパフォーマンスを低下させる。
`Finally` は、正常終了しようが例外が発生しようが、必ず実行される場所だ。
堅牢なコードの決定版
Dim reader As StreamReader = Nothing
Try
reader = New StreamReader(“C:\data.txt”)
‘ 処理を行う…
Catch ex As Exception
WriteErrorLog(ex)
Throw ‘ 再スローして上位層に通知する(握りつぶさない)
Finally
‘ ここが重要。リソースを必ず解放する
If reader IsNot Nothing Then
reader.Close()
reader.Dispose()
End If
End Try
※ 最近のVB.NETなら `Using` ステートメントを使うのがベストプラクティスだが、`Try-Catch-Finally` の本質を理解するためにこの構造を叩き込んでおいてほしい。
—
結論:コードは「自分以外の誰か」のために書く
業務自動化ツールを開発しているとき、エラーは必ず起きる。避けられない。
しかし、「エラーを予見し、記録し、安全に終了させるコード」を書いておけば、あなたは「ツールを壊す人」から「システムを守るエンジニア」へ変わる。
1. 粒度の細かいTry-Catchを書くこと。
2. ログには「どこで何が起きたか」を克明に残すこと。
3. リソースはFinallyで必ず掃除すること。
この3つを守るだけで、君のツールは現場で圧倒的な信頼を勝ち取るはずだ。さあ、今すぐ自分のコードを見直し、退屈なエラー画面を「制御された美しい終了処理」へと書き換えてみてほしい。
