知識マップ: 想定外例外で終了すべきか継続すべきかの判断表

記事「想定外例外で終了すべきか継続すべきかの判断表」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

想定外の例外への対応は、catch (Exception)で握りつぶして処理を継続することではなく、共有状態の不変条件と失敗単位、外部副作用を説明できるかどうかで継続か終了かを判断すべきだと整理する記事です。StackOverflowExceptionやAccessViolationException、深刻なOutOfMemoryExceptionのようにメモリ破壊の兆候を伴う例外や、COM・P/Invokeなどネイティブ境界の異常は終了寄りで、Environment.FailFastやEnvironment.Exitが終了の実装手段になります。BackgroundServiceの親ループが想定外例外で落ちた場合は、Windowsサービスとして動かす限りEnvironment.Exitで終了コードを返さないと回復操作が働かず、AppDomain.UnhandledExceptionなどの未処理例外ハンドラーは記録に使うべきで状態の回復手段ではないことも扱います。

想定外の例外を継続すべきか終了すべきかの知識マップ想定外の例外に対する継続と終了の判断が不変条件・失敗単位・外部副作用の確認を前提とすること、メモリ破壊が疑われる例外やネイティブ境界の異常が終了寄りであること、BackgroundServiceの想定外例外時にはEnvironment.Exitでの終了コードがWindowsサービスの回復操作に必要なこと、未処理例外ハンドラーは回復ではなく記録に使うべきであることを示す図前提とする前提とする前提とする原因になり得る用いるのは非推奨推奨される対応推奨される対応推奨される対応原因になり得る推奨される対応実装を担う実装を担う原因になり得る推奨される対応前提とする用いるのは非推奨実装を担う用いるのは非推奨両立しない防止するで確認できる想定外の例外不変条件処理の継続失敗単位外部副作用catch (Exception)での握りつぶしゾンビ化プロセスの終了StackOverflowExceptionAccessViolationExceptionEnvironment.FailFastOutOfMemoryExceptionメモリ破壊の兆候Environment.Exitネイティブ境界BackgroundServiceIHostApplicationLifetime.StopApplicationWindowsサービス未処理例外ハンドラ例外後の状態回復の試み

概念間の関係(全21件)

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

主要概念の定義

想定外の例外
NullReferenceExceptionのように処理の前提が崩れたことを示す例外で、その後も状態を信用してよいか怪しいため、request/job境界で主ログして失敗応答にすべきもの。
不変条件
処理の前後で必ず成り立っていなければならない、状態に関する約束のこと。
処理の継続
失敗した範囲を切り離し、プロセスを終了せずに処理を続ける選択のこと。
catch (Exception)での握りつぶし
例外の種類を区別せずcatch (Exception)で受け止め、ログだけ出して処理を続行させるアンチパターンのこと。
プロセスの終了
壊れた可能性のある範囲を切り離せないと判断し、プロセスを終了させる選択のこと。
Environment.FailFast
try/finallyとfinalizerを実行させずにプロセスを即座に終了させ、イベントログへの記録とダンプ採取を行う.NETのAPIのこと。
AccessViolationException
保護されたメモリへの不正アクセスが起きたときに送出される.NETの例外のこと。
Environment.Exit
指定した終了コードでプロセスを即座に終了させる.NETの静的メソッド。
ネイティブ境界
COM・P/Invoke・vendor SDKのcallbackなど、managedコードとネイティブコードが接する境界のこと。
BackgroundService
IHostedServiceの書きやすい実装補助となる抽象クラスで、長く走る本体をExecuteAsyncに書ける。
IHostApplicationLifetime.StopApplication
ホストを正常に畳むことを要求する.NETのAPIのこと。Windowsサービスとして動かす場合、呼び出すとSCMへSERVICE_STOPPEDが報告される。
未処理例外ハンドラ
AppDomain.UnhandledExceptionやWPFのDispatcherUnhandledException、WinFormsのThreadExceptionなど、回復ポイントではなく最後の記録地点となる、呼び出し階層の最終境界。

機械可読データ

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