セージ の メモ書き

メモこそ命の恩人だ

C# - 例外の再スロー

再スロー方法

try
{
    // ...
}
catch (Exception ex)
{
    throw;
    
    // throw ex;
    // ↑注意:この場合、スタックトレースが消える。
}
  • catch 句の中で throw を呼び出すだけ。
  • 呼び出し元のメソッドに例外が伝わる。スタックトレースも保持。

以下、試してみる。

public class SampleClass 
{
    public void Execute()
    {
        try
        {
            ExecuteCore1();
        }
        catch (Exception ex)
        {
            Debug.WriteLine("■■■ catch - その1 ■■■");
            Debug.WriteLine(ex.ToString());
            throw;
            // throw ex; ★ この場合、スタックトレースがここで消える。結果は後述参照。
        }
    }

    // ダミーのメソッドを経由し、スタックトレースを確認する。
    private void ExecuteCore1() => ExecuteCore2();
    private void ExecuteCore2() => ExecuteCore3();
    private void ExecuteCore3() => throw new NotImplementedException();
}
try
{
   new SampleClass().Execute();
}
catch (Exception ex)
{
    Debug.WriteLine("■■■ catch - その2 ■■■");
    Debug.WriteLine(ex.ToString());
}

"throw" の場合のスタックトレース

■■■ catch - その1 ■■■
System.NotImplementedException: The method or operation is not implemented.
   at SampleClass.ExecuteCore3() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 46
   at SampleClass.ExecuteCore2() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 45
   at SampleClass.ExecuteCore1() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 44
   at SampleClass.Execute() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 34

■■■ catch - その2 ■■■
System.NotImplementedException: The method or operation is not implemented.
   at SampleClass.ExecuteCore3() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 46
   at SampleClass.ExecuteCore2() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 45
   at SampleClass.ExecuteCore1() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 44
   at SampleClass.Execute() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 34
   at Program.<Main>$(String[] args) in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 17

"throw ex" の場合のスタックトレース
スタックトレースがなくなることを確認。

■■■ catch - その1 ■■■
System.NotImplementedException: The method or operation is not implemented.
   at SampleClass.ExecuteCore3() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 46
   at SampleClass.ExecuteCore2() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 45
   at SampleClass.ExecuteCore1() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 44
   at SampleClass.Execute() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 34

■■■ catch - その2 ■■■
System.NotImplementedException: The method or operation is not implemented.
   at SampleClass.Execute() in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 41
   at Program.<Main>$(String[] args) in C:\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 17



以上