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

定石3: Exceptionフィルタ(when句)でcatch内if分岐を排除

出典: C# 例外処理の正解 — try-catch-finally / using / Exception フィルタ (when句) の使い分け定石3: Exceptionフィルタ(when句)でcatch内if分岐を排除

定石3: Exceptionフィルタ(when句)でcatch内if分岐を排除 (csharp)#2abecfea594d
// ✅定石3-a: Exceptionフィルタ(when句)でデッドロックだけリトライ
try
{
    ExecuteSql();
}
catch (SqlException ex)when (ex.Number == 1205)
{
    // SQL Serverデッドロック(Error 1205)の時だけリトライ
    Thread.Sleep(100);
    ExecuteSql();
}
catch (SqlException ex)when (ex.Number == -2)
{
    //タイムアウトの時だけ別処理
    Logger.Warn($"SQL Timeout: {ex.Message}");
    throw new TimeoutException("DBアクセスがタイムアウトしました", ex);
}
catch (SqlException ex)
{
    //上のwhenにマッチしないSqlExceptionはここで捕まる
    Logger.Error($"DBエラー: {ex.Number} {ex.Message}");
    throw;
}
 
// ❌ NG: catch内でif分岐すると、フィルタにマッチしなかった例外を再スローし忘れる事故が起きる
try
{
    ExecuteSql();
}
catch (SqlException ex)
{
    if (ex.Number == 1205){ /* リトライ */ }
    else if (ex.Number == -2){ /* タイムアウト */ }
    //それ以外を握りつぶしてる罠
}
▸ 実行ボタンで結果を表示
  • id: #2abecfea594d
  • lines: 35
  • extracted: 2026-06-10
  • captured: 2026-06-10

Source収録記事

この snippet は記事の「定石3: Exceptionフィルタ(when句)でcatch内if分岐を排除」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

8
図鑑トップ