【Visual Studio C# デバッグ入門 】「例外設定」機能を徹底解説

本ブログでは初学者向けに、デバッグに役立つ「例外設定」機能を紹介します。

例外がキャッチされてるのに原因が分からない…?
そんな悩みを解決するのが、Visual Studio の「例外設定」機能です。C# プログラマ向けに、Visual Studio の「例外設定」機能の基本から活用テクまでわかりやすく紹介します。

Visual Studio C#「 例外設定」とは?

例外設定ウィンドウでは、以下のようなことができます。

  • 特定の例外が発生した瞬間(スローされた瞬間)に中断try-catch で捕捉されていても)
  • 例外の種類ごとに中断の有無を設定
  • 独自に定義したカスタム例外も追加可能

Visual Studio C#「 例外設定」の使い方

  1. [デバッグ] > [ウィンドウ] > [例外設定] を選択
  2. 表示されたウィンドウで例えば
    • Common Language Exception のSystem.DivideByZeroException(0割り) にチェックを入れる
  3. これで、その例外がスローされた瞬間に Visual Studio が中断してくれます

■簡単な具体例

通常は catch に入って処理が続きますが、例外設定で DivideByZeroException にチェックを入れておくと、例外発生の行で中断してくれます。これにより、例外の発生箇所を正確に特定できます。

Visual Studio C# でチェックを推奨する主なCLR例外

  • System.NullReferenceException(ヌル参照例外)
  • System.AccessViolationException(メモリアクセス違反)
  • System.DivideByZeroException(ゼロ除算例外)
  • System.InvalidOperationException(無効な操作)
  • System.IndexOutOfRangeException(配列の範囲外アクセス)
  • System.StackOverflowException(スタックオーバーフロー)
  • System.OutOfMemoryException(メモリ不足)
  • System.ArgumentException(無効な引数)
  • System.ArgumentNullException(ヌル引数)
  • System.ArgumentOutOfRangeException(範囲外の引数)
  • System.IO.IOException(入出力エラー)
  • System.FormatException(フォーマットエラー)
  • System.TypeInitializationException(型の初期化エラー)
  • CLR例外
    • .NET の Common Language Runtime (CLR) によって管理される例外。これは、C# や VB.NET などの .NET 言語で発生する例外を統一的に処理するための仕組です。
  • 上記の推奨するCLR例外の中には標準でチェックが入っている場合もあります。

「Visual Studio C#」カスタム例外

C# では特定のエラー状況を、標準の Exception クラスを継承する事で自作の例外として定義する事も可能です。

自作の例外(例:MyCustomException)は、例外設定ウィンドウの「+」ボタンから追加すれば、CLRと同様に中断対象にできます。

※名前空間を定義している場合は、名前空間名を付けて追加する

カスタム例外を活用するメリット

  • 広範囲に try-catch を使っているコードでも、例外の発生箇所を特定しやすくなる
  • 非同期処理や外部ライブラリの例外も追いやすくなる
  • 「マイコードのみ」設定と組み合わせると、ユーザーコードに限定して中断可能となる

カスタム例外を使用すべき状況

  • ドメイン固有のエラーを表現したい
    • 例:銀行システムで「残高不足」を表す InsufficientFundsException
    • 例:ECサイトで「在庫切れ」を表す OutOfStockException
  • 特定のエラーに対して専用の処理をしたい
    • 例:FileProcessingException を作成し、ファイル関連のエラーを一括管理
    • 例:InvalidUserInputException を作成し、ユーザー入力エラーを適切に処理
  • 標準の例外では意味が曖昧な場合
    • ArgumentException ではなく InvalidPasswordException など、より明確なエラー名を付けることで可読性向上
  • エラー情報を追加したい
    • 例:DatabaseConnectionExceptionConnectionString を保持し、ログ出力時に詳細情報を提供

Visual Studio C#「カスタム例外」の作成手順

カスタム例外のサンプルとしてファイルが存在しない場合に、catch で補足するのではなく、例外をスローした行で実行を中断する設定を紹介します。

  • ソースコード
    • Exceptionクラスを継承したカスタム例外「FileMissingException」を作成
      • FilePath プロパティ を追加し、例外発生時に 問題のあるファイルのパスを保持
      • コンストラクタで messagefilePath を受け取り、base(message) で親クラスの Exception にメッセージを渡す
    • 処理部分
      • ファイルが存在するかを確認し、ファイルがなかったら「FileMissingException」例外をスローする
      • 「FileMissingException」例外はcatchでも補足
  • 例外設定にカスタム例外「FileMissingException」を追加
    • [デバッグ] > [ウィンドウ] > [例外設定] で例外設定画面を表示
    • 今回は、①の「Common Language Runtime Exceptions」を選択
    • ②の追加「+」がクリックできるようになるのでクリック
  • 入力欄にカスタム例外の名称を入力(namespaceを定義している場合はnamespace名を付加)
  • Debugモードで実行すると、例外のスローで実行が中断する
  • Debugモードなしで実行すると、catchで補足される
タイトルとURLをコピーしました