知識マップ: 例外処理でcatchとログはどこに置くべきか

記事「例外処理でcatchとログはどこに置くべきか」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事はC#/.NETの例外処理において、例外を捕まえる境界と主ログを出す場所を分けることを提案します。一番深いhelper/utility層では広くcatchせず、Repository/Gateway層は下位実装固有の例外を意味のある失敗へ翻訳し、Application Service/UseCase層は想定内の失敗を結果化し、UI/HTTP/Job境界が失敗単位と運用文脈をそろえて主ログを1回だけ出す地点になりやすいとしています。未処理例外ハンドラは回復ポイントではなく最後の記録地点で、終了・再起動導線を整えます。各層での重複したErrorログ、throw exによるスタックトレースの喪失、OperationCanceledExceptionを障害ログとして扱うことは、いずれも原因追跡を難しくするため避けるべき対応として位置づけられています。

例外処理でcatchとログをどこに置くべきかの知識マップ例外を捕まえる境界・主ログ・結果化・例外の翻訳という役割を、helper層からRepository/Gateway層・UseCase層・UI/HTTP/Job境界・未処理例外ハンドラへどう配分するかを示す図用いるのは非推奨推奨される対応原因になり得る原因になり得る防止する実装を担う利用する実装を担う推奨される対応実装を担う用いるのは非推奨原因になり得る原因になり得る実装を担う推奨される対応より先に行うべき前提とする利用する利用する用いるのは非推奨用いるのは非推奨用いるのは非推奨推奨される対応推奨される対応用いるのは非推奨例外を捕まえる境界主ログ深い層での広いcatchhelper/utility/private method層失敗単位障害原因追跡の困難各層での重複ログRepository/Gateway/SDKラッパー層例外の.NET変換局所的なretryApplication Service/UseCase層結果化想定内の失敗UI/HTTP/Job/Message境界OperationCanceledExceptionthrow ex;によるスタックトレース書き換えスタックトレースの喪失未処理例外ハンドラ終了・再起動導線BackgroundServiceの未処理例外想定外の例外

概念間の関係(全25件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

例外を捕まえる境界
画面操作1回・HTTPリクエスト1本・ジョブ1件・メッセージ1件のように、retry・結果化・継続可否を責任を持って判断できる処理の区切りで、例外をcatchすべき場所とされる境界。
主ログ
1つの失敗に対して1回だけ出す、失敗単位と運用文脈(requestIdやuserIdなど)を伴うErrorまたはCriticalレベルの記録。
深い層での広いcatch
一番深いhelperや共通関数でcatch (Exception)して null や false を返すなど、判断ができない場所で広く例外を受け止めてしまう書き方。
失敗単位
画面操作1回、HTTPリクエスト1本、ジョブ1件、メッセージ1件、CSVの1行など、何が1回失敗したかを表す業務上まとまりのある処理の単位。
各層での重複ログ
1回の障害に対してRepository・Service・Controller・未処理例外ハンドラなど複数の層が同じ例外をそれぞれErrorやCriticalとして記録してしまうこと。
Repository/Gateway/SDKラッパー層
DBドライバ、HTTP通信、ファイルI/O、vendor SDKなど下の層の実装都合が表に出る、外部I/Oを扱う境界の層。
Application Service/UseCase層
保存処理や注文確定、CSV取り込みのようなユースケースとしてまとまりのある単位を扱い、失敗単位を決められる層。
結果化
例外として投げ続けるのをやめて、Result型や失敗を表すDTOのような戻り値へ変え、想定内の失敗を呼び出し元が分岐で扱える形にすること。
UI/HTTP/Job/Message境界
WinForms/WPFの保存ボタン押下、ASP.NET CoreのHTTPリクエスト1本、workerのメッセージ1件のように、何の操作か・誰の操作かを知っている境界で、多くのアプリで主ログ地点になりやすい層。
OperationCanceledException
利用者による中断やシャットダウンによって発生する例外で、制御フローの一部として扱われ、普通はErrorログの対象にしないもの。
throw ex;によるスタックトレース書き換え
再スローの際にthrow ex;と書いてしまうことで、その行でスタックトレースが上書きされてしまう書き方。throw;を使うのが基本とされる。
スタックトレースの喪失
本当の例外発生位置を示すスタックトレース情報が失われ、後から原因を追えなくなる状態。
未処理例外ハンドラ
AppDomain.UnhandledExceptionやWPFのDispatcherUnhandledException、WinFormsのThreadExceptionなど、回復ポイントではなく最後の記録地点となる、呼び出し階層の最終境界。
終了・再起動導線
未処理例外ハンドラが担う、最終ログやflush・dump採取に加えて整備すべき、終了コードや再起動のための導線。
helper/utility/private method層
文字列変換・パース・計算・内部整形のような、どの画面操作やrequestだったかを知らない、呼び出し階層の一番深い層。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。