C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の連鎖例外(Chained Exceptions)とは?基本的な使い方と実装例を解説

連鎖例外とは

連鎖例外(Chained Exceptions)とは、複数のtry-catch文が連鎖的に組み合わさり、発生した例外を順番に処理しながら上位の呼び出し元へ伝播させていく仕組みです。C#では、新しい例外をスローするときにコンストラクタの第2引数として元の例外(内部例外:InnerException)を渡すことで、例外同士をチェーンのようにつなぐことができます。

これにより、「どこで・どのような原因で」例外が発生したのかという情報を失うことなく、呼び出し階層全体で例外を追跡できるようになります。

それでは、実際に連鎖例外を作成してみましょう。まずは、エントリポイントであるMainメソッドに最初のtry-catchを設定します。

static void Main(string[] args) {
   try {
      One();
   } catch (Exception e) {
      Console.WriteLine(e);
   }
}

次に、メソッドOne()の中にtry-catchを実装します。ここでキャッチした例外は、そのまま握りつぶさずに、新しい例外へラップして再スローするのがポイントです。

static void One() {
   try {
      Two();
   } catch (Exception e) {
      throw new Exception("First exception!", e);
   }
}

メソッドTwo()でも同じように、さらに次のメソッドを呼び出し、キャッチした例外を新しい例外に包んで投げることで、例外の連鎖が続いていきます。

static void Two() {
   try {
      Three();
   } catch (Exception e) {
      throw new Exception("Second Exception!", e);
   }
}

続いて、次のメソッドThree()も同様の構造になっています。

static void Three() {
   try {
      Last();
   } catch (Exception e) {
      throw new Exception("Third Exception!", e);
   }
}

最後に、連鎖の起点となるLast()メソッドです。ここで最初の例外が発生します。

static void Last() {
   throw new Exception("Last exception!");
}

実行結果

上記のコードを実行すると、各メソッドで例外がラップされながら伝播し、最終的にMainメソッドのcatchブロックでまとめて出力されます。実行結果は以下のようになります。

System.Exception: First exception! ---< System.Exception: Middle Exception! ---< System.Exception: Last exception!
at Demo.Two () [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0
--- End of inner exception stack trace ---
at Demo.Two () [0x00016] in <199744cb72714131b4f5995ddd1a021f>:0
at Demo.One () [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0
--- End of inner exception stack trace ---
at Demo.One () [0x00016] in <199744cb72714131b4f5995ddd1a021f>:0
at Demo.Main (System.String[] args) [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0

まとめ

このように、例外を再スローする際に元の例外を引数として渡すことで、例外の発生源から最終的な処理場所まで、スタックトレースの情報を保ったまま例外を連鎖させることができます。デバッグやログ出力の際に原因を特定しやすくなるため、大規模なアプリケーション開発では非常に有用なテクニックです。

  1. Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで

    Rails開発者なら、Railsコンソールを頻繁に使う方も多いのではないでしょうか。そして今や、RailsコンソールといえばPryが定番。素のIRBと比べると、その使い勝手は段違いです。 実はPryには、例外を扱う際に非常に便利な機能が標準で組み込まれています。この記事では、その中でも特に役立つ3つの機能を紹介します。 直近の例外の完全なバックトレースを表示する Pry(IRBでも同様)で例外が発生すると、通常は短縮されたバックトレースが表示されます。多くの場合それで十分ですが、詳細を確認したい場面もありますよね。 そんなときは wtf -v コマンドを使いましょう。直近の例外の完全な

  2. Rubyでカスタム例外を作成する方法【初心者向けガイド】

    Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。 1. 新しいクラスを作成する Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。 class MyError < StandardError end raise MyError 慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュ