カテゴリ: VB.NET 更新日: 2026/01/20

VB.NETでアプリケーション全体の例外をキャッチする方法を完全ガイド

VB.NETでアプリケーション全体の例外をキャッチする方法
VB.NETでアプリケーション全体の例外をキャッチする方法

先生と生徒の会話形式で理解しよう

生徒

「VB.NETでプログラムを作っていますが、予想外の場所でエラーが起きると、アプリがいきなり消えてしまいます。全部の場所にTry-Catchを書くのは大変なのですが……。」

先生

「それは困りましたね。実はVB.NETには、アプリのどこでエラーが起きても最後に助けてくれる『最後の砦』のような仕組みがあるんですよ。」

生徒

「最後の砦ですか?それがあれば、どんなエラーが起きてもアプリが突然終了するのを防げるんですか?」

先生

「その通りです!『集約例外処理』といって、アプリケーション全体の例外を一箇所でキャッチする方法を解説しましょう!」

1. アプリケーション全体の例外処理とは?

1. アプリケーション全体の例外処理とは?
1. アプリケーション全体の例外処理とは?

VB.NETの例外処理(れいがいしょり)は、通常 Try...Catch という命令を使って、エラーが起きそうな場所を個別に囲みます。しかし、プログラムが大きくなると、何千箇所もあるコード全てを囲むのは現実的ではありません。また、人間ですから、どうしても囲み忘れてしまう場所が出てきます。

プログラミング未経験の方に例えると、個別に対策するのは「家中のすべての床にクッションを敷き詰める」ようなものです。これに対してアプリケーション全体の例外処理は、「家中どこで転んでも大丈夫なように、全員にヘルメットを被ってもらう」あるいは「家全体を魔法のバリアで包む」ような仕組みです。どこでエラーが発生しても、アプリがパニックを起こして消えてしまう前に、このバリアがエラーを優しく受け止めてくれます。これにより、信頼性の高いシステムを作ることができます。

2. なぜ「最後の砦」が必要なのか

2. なぜ「最後の砦」が必要なのか
2. なぜ「最後の砦」が必要なのか

パソコンを触ったことがない方にとって、アプリがいきなり消える(クラッシュする)のは非常に怖い体験です。作っていたデータが消えてしまうかもしれませんし、何が起きたのか全く分からず不安になります。プロの現場では、これを防ぐために必ずグローバル例外ハンドラと呼ばれる仕組みを導入します。

この仕組みの最大のメリットは、エラーの内容をログ(実行記録)として保存できることです。アプリが止まる直前に「〇〇という理由で止まりそうです!」という証拠を残しておけば、後でエンジニアがその証拠を見て修理することができます。また、ユーザーに対して「申し訳ありません、不具合が起きました」と丁寧なメッセージを表示することも可能になります。VB.NETで本格的なアプリを作るなら、避けては通れない非常に重要な例外処理の設計です。

3. Windowsフォームアプリでのキャッチ方法

3. Windowsフォームアプリでのキャッチ方法
3. Windowsフォームアプリでのキャッチ方法

VB.NETで最も一般的な「Windowsフォームアプリケーション」では、UnhandledException(アンハンドルド・エクセプション)というイベントを利用します。これは「ハンドル(処理)されなかった例外」という意味で、要するに Try...Catch をすり抜けてきた迷子のエラーたちのことです。

このエラーを捕まえるには、プロジェクトの設定にある「アプリケーションイベント」という場所にコードを書きます。ここが一箇所にまとまったエラーの受け付け窓口になります。パソコンの基本操作しか知らない方でも、決まった場所に魔法の言葉をコピーするだけで、強力な守護神を呼び出すことができます。


' ApplicationEvents.vb という特別なファイルに記述します
Partial Friend Class MyApplication
    ' アプリのどこかで、キャッチされなかったエラーが起きた時に動く
    Private Sub MyApplication_UnhandledException(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
        ' エラーの内容をメッセージボックスで表示
        MessageBox.Show("予期せぬエラーが発生しました。管理者にお知らせください。" & vbCrLf & e.Exception.Message, 
                        "重大なエラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        
        ' e.ExitApplication を True にするとアプリを終了、False にすると継続を試みます
        e.ExitApplication = True
    End Sub
End Class

4. コンソールアプリでのキャッチ方法

4. コンソールアプリでのキャッチ方法
4. コンソールアプリでのキャッチ方法

文字だけで動く「コンソールアプリケーション」の場合は、少し書き方が異なります。AppDomain(アップ・ドメイン)という、アプリが動いている「領域そのもの」に対して、エラー監視のセンサーを貼り付けるイメージです。

こちらは AddHandler という命令を使って、プログラムが始まった瞬間に「もしエラーが起きたら、この処理を動かしてね」と予約しておきます。データ型と変数を学ぶ段階では少し難しく感じるかもしれませんが、「予約ボタンを押しておく」と考えれば分かりやすいでしょう。制御構造がどんなに複雑になっても、この予約さえあれば安心です。


Module Module1
    Sub Main()
        ' プログラムの開始時に「エラー監視センサー」をセットする
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf MyErrorHandler

        ' ここから実際の処理が始まる
        Console.WriteLine("プログラム実行中...")
        Throw New Exception("わざとエラーを起こしてみます。")
    End Sub

    ' エラーが起きた時に呼び出される専用の処理
    Sub MyErrorHandler(sender As Object, e As UnhandledExceptionEventArgs)
        Dim ex As Exception = DirectCast(e.ExceptionObject, Exception)
        Console.WriteLine("【全域エラー検知】: " & ex.Message)
        ' ログファイルに保存する処理などをここに書く
    End Sub
End Module

5. エラー内容をファイルに保存する(ロギング)

5. エラー内容をファイルに保存する(ロギング)
5. エラー内容をファイルに保存する(ロギング)

全体で例外をキャッチできるようになったら、次にすべきことはログ出力です。エラーの内容をこっそりノート(テキストファイル)に書き留めておく作業です。これは、お医者さんが書く「カルテ」のようなものです。

いつ、どんなエラーが、どのコードの場所で起きたのかを記録することで、後からの原因究明が劇的に楽になります。ファイル操作の知識を少し使いますが、基本的には文字列をファイルに追記していくだけです。この記録さえあれば、「さっきアプリが消えたんだけど!」と言われても、「はい、原因はこのエラーですね」とスマートに答えられるようになります。エンジニアとして信頼されるための必須スキルです。

6. ユーザーへの通知と継続・終了の判断

6. ユーザーへの通知と継続・終了の判断
6. ユーザーへの通知と継続・終了の判断

全ての例外を捕まえた後、プログラムを「無理やり続ける」か「安全に閉じる」かという究極の選択を迫られます。多くの場合、予期せぬエラーが起きた後のアプリは、内部がぐちゃぐちゃになっている可能性が高いです。そのため、基本的には安全に終了させるのがベストプラクティスです。

無理に続けると、壊れたデータのまま保存してしまい、取り返しのつかないことになるかもしれません。ユーザーには「不具合が起きたため、データを保護するために終了します」と丁寧に伝え、再起動を促すのが、ユーザーインターフェース設計における「優しさ」です。例外処理は、ただエラーを止めるだけでなく、ユーザーを迷わせないための道しるべでもあります。

7. try-catchとの使い分け(役割分担)

7. try-catchとの使い分け(役割分担)
7. try-catchとの使い分け(役割分担)

ここで注意してほしいのは、「全体の例外処理があるから、個別のTry-Catchはもう要らないんだ!」と思わないことです。これらは役割が違います。

個別の Try...Catch は、「ここでエラーが起きるかもしれないから、起きたらこうリカバーしよう」という具体的な対策です。一方で全体の例外処理は、「万が一、対策漏れがあったときの最終的な救済」です。

  • 個別対策: ネットが切れていたら再接続を試みる、など。
  • 全体対策: 原因不明だけど、とにかくエラーを記録してアプリを閉じる、など。
この二段構えこそが、VB.NETにおける最強の防御陣形となります。

8. デバッグ時とリリース時の動作の違い

8. デバッグ時とリリース時の動作の違い
8. デバッグ時とリリース時の動作の違い

プログラミングをしている最中(デバッグ中)は、全体キャッチを動かさない方が良い場合もあります。なぜなら、全体キャッチがエラーを綺麗に処理してしまうと、開発ツール(Visual Studio)が「どこでエラーが起きたか」を詳しく教えてくれなくなることがあるからです。

そのため、「開発中はエラーの場所を特定するためにそのまま止める」「完成して配る(リリースする)ときは全体キャッチで守る」という切り替えを行うこともあります。アプリケーション開発の仕上げ段階で、この守護神を有効にすることで、完成度の高い製品へと昇華させることができます。

9. 独自のエラー画面を作ってブランド力を高める

9. 独自のエラー画面を作ってブランド力を高める
9. 独自のエラー画面を作ってブランド力を高める

Windows標準の素っ気ないエラーメッセージではなく、自作の綺麗な「エラーお知らせ画面」を作ることも可能です。企業のロゴを入れたり、「よくある質問はこちら」というリンクを貼ったりすることで、不具合が起きてもユーザーの不満を和らげることができます。

クラスとオブジェクト指向を活用して、エラー情報を引き渡せる専用のフォームを作ってみましょう。全体キャッチの場所から、その自作画面を呼び出すように設定すれば、あなたのアプリは一気にプロフェッショナルな見た目になります。VB.NETはこうした画面作りが非常に得意な言語ですので、ぜひ挑戦してみてください。


' 自作のエラー画面を表示する例(イメージ)
Private Sub MyApplication_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
    ' 自作のフォーム(ErrorDialog)を作って表示する
    Dim dialog As New MyErrorDialogForm()
    dialog.ErrorMessage = e.Exception.Message
    dialog.StackTrace = e.Exception.StackTrace
    dialog.ShowDialog() ' ユーザーが閉じるまで待つ
End Sub

10. 最後に意識すべきセキュリティの注意点

10. 最後に意識すべきセキュリティの注意点
10. 最後に意識すべきセキュリティの注意点

最後に、とても大切なセキュリティの話をします。エラーメッセージには、時として「パスワード」や「サーバーの場所」など、重要な秘密が含まれてしまうことがあります。全体の例外処理でメッセージを出すときは、あまりにも詳しい内容(専門的な情報)をそのまま一般のユーザーに見せないようにしましょう。

詳しい内容はログファイルにこっそり書き、画面には「内部エラーが発生しました(コード:123)」のように、差し支えない範囲で表示するのがセキュリティを意識した良い設計です。これで、エラーに強く、かつ安全なVB.NETアプリケーションの完成です。一歩ずつ、信頼されるプログラム作りを楽しんでいきましょう!

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NET Blazor入門!C#で作る最新のWebアプリ開発
New2
VB.NET
VB.NETのStack(スタック)を完全解説!LIFO処理の基本と使い方
New3
VB.NET
VB.NETのキュー(Queue)を完全解説!初心者でもわかるFIFO処理と使い方
New4
VB.NET
VB.NETのNullable型を徹底解説!初心者でもわかる使い方と注意点
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETの配列(Array)を完全マスター!初心者でも基礎からわかる宣言・初期化ガイド
No.2
Java&Spring記事人気No2
ASP.NET
ASP.NET Coreを.NET CLIで作成する方法を完全解説!初心者でも迷わないコマンド操作入門
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの例外処理で初心者がつまずくポイントと解決策!エラー対策を完全攻略
No.4
Java&Spring記事人気No4
VB.NET
VB.NETのコーディング規約を完全解説!初心者でもわかる読みやすいコードの基本ルール
No.5
Java&Spring記事人気No5
VB.NET
VB.NETでアプリケーション全体の例外をキャッチする方法を完全ガイド
No.6
Java&Spring記事人気No6
ASP.NET
Razor Pagesとは?MVCとの違いをやさしく理解しよう【ASP.NET初心者向け】
No.7
Java&Spring記事人気No7
VB.NET
VB.NETのDictionaryを完全ガイド!初心者でもわかる辞書の基本と応用
No.8
Java&Spring記事人気No8
VB.NET
VB.NETの動的配列とReDimの使い方を徹底解説!サイズ変更のコツ