知識マップ: 例外処理でcatchとログはどこに置くべきか
記事「例外処理でcatchとログはどこに置くべきか」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事はC#/.NETの例外処理において、例外を捕まえる境界と主ログを出す場所を分けることを提案します。一番深いhelper/utility層では広くcatchせず、Repository/Gateway層は下位実装固有の例外を意味のある失敗へ翻訳し、Application Service/UseCase層は想定内の失敗を結果化し、UI/HTTP/Job境界が失敗単位と運用文脈をそろえて主ログを1回だけ出す地点になりやすいとしています。未処理例外ハンドラは回復ポイントではなく最後の記録地点で、終了・再起動導線を整えます。各層での重複したErrorログ、throw exによるスタックトレースの喪失、OperationCanceledExceptionを障害ログとして扱うことは、いずれも原因追跡を難しくするため避けるべき対応として位置づけられています。
flowchart LR
accTitle: 例外処理でcatchとログをどこに置くべきかの知識マップ
accDescr: 例外を捕まえる境界・主ログ・結果化・例外の翻訳という役割を、helper層からRepository/Gateway層・UseCase層・UI/HTTP/Job境界・未処理例外ハンドラへどう配分するかを示す図
exception_catch_boundary["例外を捕まえる境界"]
primary_error_log["主ログ"]
deep_broad_catch["深い層での広いcatch"]
helper_utility_layer["helper/utility/private method層"]
failure_unit["失敗単位"]
diagnosis_difficulty["障害原因追跡の困難"]
duplicate_error_logging["各層での重複ログ"]
repository_gateway_layer["Repository/Gateway/SDKラッパー層"]
exception_translation["例外の.NET変換"]
limited_retry["局所的なretry"]
usecase_layer["Application Service/UseCase層"]
result_conversion["結果化"]
expected_failure["想定内の失敗"]
ui_http_job_boundary["UI/HTTP/Job/Message境界"]
operation_canceled_exception["OperationCanceledException"]
throw_ex_antipattern["throw ex;によるスタックトレース書き換え"]
stack_trace_loss["スタックトレースの喪失"]
unhandled_exception_handler["未処理例外ハンドラ"]
process_restart_strategy["終了・再起動導線"]
backgroundservice_unhandled_exception["BackgroundServiceの未処理例外"]
unexpected_exception["想定外の例外"]
deep_broad_catch -->|"用いるのは非推奨"| helper_utility_layer
failure_unit -->|"推奨される対応"| exception_catch_boundary
deep_broad_catch -->|"原因になり得る"| diagnosis_difficulty
duplicate_error_logging -->|"原因になり得る"| diagnosis_difficulty
primary_error_log -->|"防止する"| duplicate_error_logging
repository_gateway_layer -->|"実装を担う"| exception_translation
repository_gateway_layer -.->|"利用する"| limited_retry
usecase_layer -->|"実装を担う"| result_conversion
result_conversion -->|"推奨される対応"| expected_failure
ui_http_job_boundary -->|"実装を担う"| primary_error_log
operation_canceled_exception -->|"用いるのは非推奨"| primary_error_log
throw_ex_antipattern -->|"原因になり得る"| stack_trace_loss
stack_trace_loss -->|"原因になり得る"| diagnosis_difficulty
unhandled_exception_handler -->|"実装を担う"| process_restart_strategy
process_restart_strategy -.->|"推奨される対応"| backgroundservice_unhandled_exception
operation_canceled_exception -->|"より先に行うべき"| unexpected_exception
primary_error_log -->|"前提とする"| failure_unit
usecase_layer -->|"利用する"| repository_gateway_layer
ui_http_job_boundary -->|"利用する"| usecase_layer
primary_error_log -->|"用いるのは非推奨"| helper_utility_layer
primary_error_log -.->|"用いるのは非推奨"| repository_gateway_layer
helper_utility_layer -->|"用いるのは非推奨"| exception_catch_boundary
usecase_layer -->|"推奨される対応"| exception_catch_boundary
ui_http_job_boundary -->|"推奨される対応"| exception_catch_boundary
unhandled_exception_handler -->|"用いるのは非推奨"| exception_catch_boundary
概念間の関係(全25件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 深い層での広いcatchをhelper/utility/private method層に用いることは推奨されません。
- 失敗単位は例外を捕まえる境界に対する本記事の推奨です。
- 深い層での広いcatchは障害原因追跡の困難の原因になることがあります。
- 各層での重複ログは障害原因追跡の困難の原因になることがあります。
- 主ログは各層での重複ログを防ぎます。
- Repository/Gateway/SDKラッパー層は例外の.NET変換の実装を担います。
- Repository/Gateway/SDKラッパー層は局所的なretryを利用します。
- Application Service/UseCase層は結果化の実装を担います。
- 結果化は想定内の失敗に対する本記事の推奨です。
- UI/HTTP/Job/Message境界は主ログの実装を担います。
- OperationCanceledExceptionを主ログに用いることは推奨されません。
- throw ex;によるスタックトレース書き換えはスタックトレースの喪失の原因になることがあります。
- スタックトレースの喪失は障害原因追跡の困難の原因になることがあります。
- 未処理例外ハンドラは終了・再起動導線の実装を担います。
- 終了・再起動導線はBackgroundServiceの未処理例外に対する本記事の推奨です。
- OperationCanceledExceptionは想定外の例外より先に行うべきです。
- 主ログは失敗単位を前提とします。
- Application Service/UseCase層はRepository/Gateway/SDKラッパー層を利用します。
- UI/HTTP/Job/Message境界はApplication Service/UseCase層を利用します。
- 主ログをhelper/utility/private method層に用いることは推奨されません。
- 主ログをRepository/Gateway/SDKラッパー層に用いることは推奨されません。
- helper/utility/private method層を例外を捕まえる境界に用いることは推奨されません。
- Application Service/UseCase層は例外を捕まえる境界に対する本記事の推奨です。
- UI/HTTP/Job/Message境界は例外を捕まえる境界に対する本記事の推奨です。
- 未処理例外ハンドラを例外を捕まえる境界に用いることは推奨されません。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。