はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】その例外の再スローって必要なの?

はじめに

今回はcatchの中でthrowだけ書かれている再スローについて取り上げていきたいと思います。

結論から言うと再スローを書かなくても良いのですが、実験方法をつらつらと書いていきます。

実験

手法1

private static void Main(string[] args)
{
    try
    {
        SomeMethod();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }
}

private static void SomeMethod()
{
    try
    {
        ThrowException();
    }
    catch
    {
        throw;
    }
}

private static void ThrowException()
{
    throw new Exception();
}

手法2

private static void Main(string[] args)
{
    try
    {
        SomeMethod();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }
}

private static void SomeMethod()
{
    ThrowException();
}

private static void ThrowException()
{
    throw new Exception();
}

結果

手法1

Exception of type 'System.Exception' was thrown.
  at CSTest.MainClass.ThrowException () [0x00001] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:34 
  at CSTest.MainClass.SomeMethod () [0x0000d] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:28 
  at CSTest.MainClass.Main (System.String[] args) [0x00002] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:11 

手法2

Exception of type 'System.Exception' was thrown.
  at CSTest.MainClass.ThrowException () [0x00001] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:27 
  at CSTest.MainClass.SomeMethod () [0x00001] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:22 
  at CSTest.MainClass.Main (System.String[] args) [0x00002] in /Users/hanachiru/Projects/CSTest/CSTest/Program.cs:11 


結果としては手法1も手法2も全く同じ出力になっています。

さいごに

シンプルにthrow;しかかかない場合は正直やらなくていいのかなとは思います。

qiita.com

こちらの記事はすごくわかりやすく例外処理について書かれていますが、一番最後にこのような言葉が書かれていました。

catch句は本当に必要な箇所以外には書かないようにしましょう。

私自身注意していきたいと思います。