VB.NETで「例外」を飼いならせ:業務エラーを分離するプロの設計術
こんにちは。現場で長年VB.NETと格闘してきた先輩エンジニアです。
皆さんは、プログラムが予期せぬエラーで止まってしまった時、ユーザーにどんなメッセージを表示していますか?
「システムエラーが発生しました」の一言で済ませていませんか?
もしそうなら、今日でその「とりあえずの例外処理」とはお別れしましょう。「何が起きたのか(システムの問題か、それともユーザーの入力ミスか)」を明確に切り分けることこそ、堅牢なアプリケーションを作るための第一歩です。
今日は、VB.NETでの「カスタム例外」の作り方を通じて、システムを「壊れにくいもの」から「運用しやすいもの」へと進化させる極意をお教えします。
—
1. なぜ「システムエラー」と「業務エラー」を分けるべきなのか?
プログラムには大きく分けて2種類のエラーが存在します。
- システムエラー(想定外): データベースが死んだ、ネットワークが切れた、メモリ不足など。これはエンジニアが直すべき問題です。
- 業務エラー(想定内): 「在庫が足りない」「日付が未来になっている」など。これはユーザー自身に「こう直してください」と伝えるべき問題です。
これらを区別せず、すべて `Exception` クラスでキャッチしてしまうと、ログがゴミだらけになり、本当に調査が必要なバグを見逃す原因になります。
—
2. カスタム例外クラスを作ってみよう
VB.NETでは、`Exception` クラスを継承することで、自分専用の例外を作れます。これが「業務エラー」を表現する器になります。
”’
”’
Public Class BusinessLogicException
Inherits Exception
‘ コンストラクタ(エラーメッセージを受け取る)
Public Sub New(message As String)
MyBase.New(message)
End Sub
‘ 必要に応じて、エラーコード等を持たせることも可能です
Public Property ErrorCode As String
End Class
たったこれだけです。`Inherits Exception` と書くことで、「これは例外の一種ですよ」と.NETに教えてあげているわけです。
—
3. 実践:業務ロジックで例外を「スロー(投げる)」する
では、実際に在庫チェックの場面を想定してみましょう。
Public Sub ProcessOrder(quantity As Integer)
‘ 業務ルール:在庫が足りない場合は例外を投げる
Dim currentStock As Integer = 5 ‘ 例として在庫5
If quantity > currentStock Then
‘ ここで業務エラーをスローする!
Throw New BusinessLogicException(“在庫が足りません。現在の在庫は” & currentStock & “個です。”)
End If
‘ 通常の処理…
Console.WriteLine(“注文を受け付けました。”)
End Sub
ポイントは `Throw` です。これで処理を強制的に中断し、上位層(画面側など)へエラーを伝播させます。
—
4. 上位層での「賢い」キャッチ術
ここが最も重要です。呼び出し元では、例外の種類を見て対応を分けます。
Try
ProcessOrder(10)
Catch ex As BusinessLogicException
‘ 業務エラーなら、メッセージをそのままユーザーに表示
MessageBox.Show(ex.Message, “確認”, MessageBoxButtons.OK, MessageBoxIcon.Warning)
Catch ex As Exception
‘ それ以外の予期せぬシステムエラーなら、ログを吐いて管理者へ連絡
LogError(ex)
MessageBox.Show(“予期せぬシステムエラーが発生しました。管理者に連絡してください。”, “エラー”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
なぜこの書き方が「極意」なのか?
1. ユーザーへの優しさ: 「在庫が足りない」という具体的な情報をそのまま伝えられます。
2. 管理のしやすさ: 予期せぬエラー(データベース接続失敗など)と混ざることがないため、デバッグが劇的に楽になります。
3. 拡張性: 将来、エラーの種類が増えても `Catch` を増やすだけで柔軟に対応できます。
—
先輩からのアドバイス:ここをクリアすれば大丈夫!
初学者のうちは「例外=怖いもの、避けるもの」と考えがちですが、例外は「正しく扱う」ことで、プログラムの守り神になります。
- 「何でもかんでも Catch しない」:意味のない `Catch` はバグを隠すだけです。
- 「例外は情報の塊」:エラーメッセージだけでなく、エラーコードや関連するデータを持たせると、さらに強力な武器になります。
まずは、小さな業務ルール一つに対して、この `BusinessLogicException` を使ってみてください。コードがスッキリし、何より「自分の書いたロジックが意図通りに動いている」という実感が湧いてくるはずです。
VB.NETという強力なツールを手に、ぜひ「エラーを制御する楽しさ」を味わってください。応援していますよ!
