晴耕雨読

working in the fields on fine days and reading books on rainy days

[C#] 例外を再スローするときの注意点

元の例外を再スローすると、元の例外にあったスタックトレースが途切れてしまいます。 以下のように、throw ex と実装するのは推奨されない書き方です。

try
{
    RaiseException();
}
catch (InvalidOperationException ex)
{
    throw ex;  // スタックトレースが途切れる実装
}

上記のように実装してしまうと、RaiseException() 内部でエラーが発生した時に、その内部のスタックトレースが失われてしまいます。 そのため、デバッグするときに元の例外がどこで発生したのかがわからなくなり、原因の特定が困難になります。 この問題を回避するには、次のように throw の後に引数を指定しないように実装してください。

try
{
    RaiseException();
}
catch (InvalidOperationException ex)
{
    throw;  // 正しい実装
}

以上です。

参考資料