動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石4: throw vs throw exのスタックトレース挙動

出典: C# 例外処理の正解 — try-catch-finally / using / Exception フィルタ (when句) の使い分け定石4: throw vs throw exのスタックトレース挙動

定石4: throw vs throw exのスタックトレース挙動 (csharp)#08d0e82d4c16
// ❌ NG: throw ex;はスタックトレースが「rethrowした行」でリセットされる
public void OuterMethod()
{
    try
    {
        InnerMethod();
    }
    catch (SqlException ex)
    {
        Logger.Error($"DBエラー: {ex.Message}");
        throw ex;   // ←ここでスタックトレースが上書きされる、元の発生箇所が消える
    }
}
 
// ✅ OK: throw単独は元のスタックトレースを保持
public void OuterMethod()
{
    try
    {
        InnerMethod();
    }
    catch (SqlException ex)
    {
        Logger.Error($"DBエラー: {ex.Message}");
        throw;   // ←元のInnerMethod内の発生行が保持される
    }
}
 
// ✅ OK:別の例外型でラップする時は内部例外を保持
public void OuterMethod()
{
    try
    {
        InnerMethod();
    }
    catch (SqlException ex)
    {
        throw new ApplicationException("注文処理に失敗しました", ex);
        // ↑ inner exceptionとして元のSqlExceptionが保持される、スタックトレースも辿れる
    }
}
▸ 実行ボタンで結果を表示
  • id: #08d0e82d4c16
  • lines: 41
  • extracted: 2026-06-10
  • captured: 2026-06-10

Source収録記事

この snippet は記事の「定石4: throw vs throw exのスタックトレース挙動」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

8
図鑑トップ