例外処理

この記事を書いた人

Creative事業部 システムエンジニア<br>鬼塚 勝也
Creative事業部 システムエンジニア
鬼塚 勝也
2023.03.02

目次

例外処理

例外処理とは、エラーが起きたときにやる処理のことです。
システム停止やデータ破損の原因になり、ユーザーに損害を与える可能性があるため、しっかり記載していきましょう。

これからc#を例に説明をしていきます。

例外処理を記述するには、try-catch構文を利用します。
tryブロック内で例外が発生すると、以降の処理を中断します。
そして発生した例外が、catchブロックで指定した例外クラスかその派生クラスの場合、catchブロックに処理が移動します。

      using System;

      class Sample001 {
          static void Main() {
              try {
                  var total = 0;
                  var value = 132;
                  var result = (value / total) * 100;
              } catch (DivideByZeroException e) {
                  // 例外発生時の処理を書く
              }
          }
      }
      

複数の例外処理

複数の例外に対応するには、以下に示すようにcatchブロックを例外の数だけつなげます。
この時、継承関係にある例外の場合は、派生クラスを先に記述する必要があります。

      using System;
      using System.IO;

      class Sample002 {
          static void Main() {
              try {
                  var lines = File.ReadAllLines(@"example/001.txt");
                  foreach (var line in lines) {
                      Console.WriteLine(line);
                  }
              } catch (FileNotFoundException e) {
                  Console.WriteLine("ファイルが見つかりません");
              } catch (DirectoryNotFoundException e) {
                  Console.WriteLine("ディレクトリが見つかりません");
              } catch (IOException e) {
                  Console.WriteLine("ファイルの入出力でエラーが発生しました");
              }
          }
      }
      

例外情報

例外オブジェクトには、共通で利用できるプロパティがあります。
これらのプロパティは例外が発生した場所や原因を特定するのに役立ちます。

プロパティ 意味
Exception.Message 現在の例外を説明するメッセージを取得します。
Exception.Source エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。
Exception.StackTrace 呼び出し履歴で直前のフレームの文字列形式を取得します。
Exception.TargetSite 現在の例外がスローされたメソッドを取得します。
      using System;
      using System.IO;

      class Sample003 {
          static void Main() {
              try {
                  var lines = File.ReadAllLines(@"example/001.txt");
                  foreach (var line in lines) {
                      Console.WriteLine(line);
                  }
              } catch (IOException e) {
                  Console.WriteLine($"Message:{e.Message}");
                  Console.WriteLine($"Source:{e.Source}");
                  Console.WriteLine($"TargetSite:{e.TargetSite}");
                  Console.WriteLine($"StackTrace:{e.StackTrace}");
              }
          }
      }
      

例外発生後の後処理

try-finally構文を利用することで、確実に後処理をすることができます。
tryブロック内で例外が発生した場合でも、finallyブロック内の処理が実行されます。

      using System;
      using System.IO;

      class Sample004 {
          static void Main() {
              try {
                  var lines = File.ReadAllLines(@"example/001.txt");
                  foreach (var line in lines) {
                      Console.WriteLine(line);
                  }
              } catch (IOException e) {
                  Console.WriteLine("エラーが発生しました");
              } finally {
                  Console.WriteLine("後処理を記述する");
              }
          }
      }
      

例外を呼び出し元にスロー

例外を呼び出し元に発生させるには、'throw'キーワードを利用します。

      using System;
      using System.IO;

      class Sample005 {
          static void Main() {
              try {
                  ReadTextFile();
              } catch (IOException e) {
                  Console.WriteLine(e.Message);
              }
          }

          static void ReadTextFile() {
              try {
                  var lines = File.ReadAllLines(@"example/001.txt");
                  foreach (var line in lines) {
                      Console.WriteLine(line);
                  }
              } catch (IOException e) {
                  // 例外を呼び出し元にスロー
                  throw e;
              }
          }
      }
      

独自例外

アプリケーション独自の例外をクラスを定義する場合は、`Exception`クラスを継承します。
例外クラスの名前は必ず、Exceptionで終わるようにします。

例外クラスの本体部分では、以下の3つのコンストラクタを定義します。

・パラメータなしのコンストラクタ
・文字列メッセージを受け取るコンストラクタ
・文字列メッセージと内部例外を受け取るコンストラクタ

      using System;

      class Sample006 {
          static void Main() {
              try {
                  throw new MyAppException("独自例外が発生しました");
              } catch (MyAppException e) {
                  Console.WriteLine(e.Message);
              }
          }
      }

      public class MyAppException : Exception {
          public MyAppException() {}
          public MyAppException(string message) : base(message) {}
          public MyAppException(string message, Exception e) : base(message, e) {}
      }
      

M&TTでは、「わくわく」を実現する仲間を募集しています!
皆様のご応募お待ちしております!