C# の例外

  • 例外がスローされると実行中のメソッドは停止されて、その例外に対する適切な例外ハンドラが見つかるまでスタックが巻き戻されます。
  • finally ブロックの処理は、例外が発生しようとするまいと実行されます。なお、finally ブロック内で、ブロックを抜け出すために、goto や return を使おうとするとエラーになります。
  • 例外オブジェクトの StatckTrace プロパティは、コールスタックを表示します。それによって、どのメソッドが例外をスローしたのかが分かります。
  • 例外が起こった際、catch ブロックの中で何らかの補償処理を行った後、外側の try ブロックで処理を行うために、キャッチした例外を再スローすることも、別の例外をスローすることもできます。別の例外をスローする場合、例外スローの履歴を取得できるように、元の例外を内包するような新しい例外を作成してスローするべきです。
public class MyException : ApplicationException
{
  public MyException(string mes, Exception inner)
    : base(mes, inner)
  //!< 二個目の引数は、前の例外への参照を格納させる、プロパティ InnerException に格納されます
  {
  }
}

public class Test
{
  public static void Main()
  {
    try
    {
      DoDanger();
    }
    catch (Exception ex)
    {
      MyException exnew = new MyException("Test.Main() 内での例外", ex); //!<例外の内包
      throw exnew;
      //throw; とするとキャッチした例外をそのまま再スローします
    }
  }

  private static void DoDanger()
  {
    throw new Exception("DoDanger() 内での例外");
  }
}