知識マップ: 想定外例外で終了すべきか継続すべきかの判断表
記事「想定外例外で終了すべきか継続すべきかの判断表」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
想定外の例外への対応は、catch (Exception)で握りつぶして処理を継続することではなく、共有状態の不変条件と失敗単位、外部副作用を説明できるかどうかで継続か終了かを判断すべきだと整理する記事です。StackOverflowExceptionやAccessViolationException、深刻なOutOfMemoryExceptionのようにメモリ破壊の兆候を伴う例外や、COM・P/Invokeなどネイティブ境界の異常は終了寄りで、Environment.FailFastやEnvironment.Exitが終了の実装手段になります。BackgroundServiceの親ループが想定外例外で落ちた場合は、Windowsサービスとして動かす限りEnvironment.Exitで終了コードを返さないと回復操作が働かず、AppDomain.UnhandledExceptionなどの未処理例外ハンドラーは記録に使うべきで状態の回復手段ではないことも扱います。
flowchart LR
accTitle: 想定外の例外を継続すべきか終了すべきかの知識マップ
accDescr: 想定外の例外に対する継続と終了の判断が不変条件・失敗単位・外部副作用の確認を前提とすること、メモリ破壊が疑われる例外やネイティブ境界の異常が終了寄りであること、BackgroundServiceの想定外例外時にはEnvironment.Exitでの終了コードがWindowsサービスの回復操作に必要なこと、未処理例外ハンドラーは回復ではなく記録に使うべきであることを示す図
unexpected_exception["想定外の例外"]
invariant["不変条件"]
continue_processing["処理の継続"]
failure_unit["失敗単位"]
external_side_effect["外部副作用"]
catch_exception_antipattern["catch (Exception)での握りつぶし"]
zombie_process["ゾンビ化"]
terminate_process["プロセスの終了"]
stackoverflowexception["StackOverflowException"]
accessviolationexception["AccessViolationException"]
environment_failfast["Environment.FailFast"]
outofmemoryexception["OutOfMemoryException"]
memory_corruption_symptom["メモリ破壊の兆候"]
environment_exit["Environment.Exit"]
native_interop_boundary["ネイティブ境界"]
backgroundservice["BackgroundService"]
stopapplication["IHostApplicationLifetime.StopApplication"]
windows_service["Windowsサービス"]
unhandled_exception_handler["未処理例外ハンドラ"]
exception_recovery_attempt["例外後の状態回復の試み"]
continue_processing -->|"前提とする"| invariant
continue_processing -->|"前提とする"| failure_unit
continue_processing -->|"前提とする"| external_side_effect
catch_exception_antipattern -.->|"原因になり得る"| zombie_process
catch_exception_antipattern -->|"用いるのは非推奨"| unexpected_exception
terminate_process -->|"推奨される対応"| stackoverflowexception
terminate_process -->|"推奨される対応"| accessviolationexception
environment_failfast -->|"推奨される対応"| outofmemoryexception
accessviolationexception -.->|"原因になり得る"| memory_corruption_symptom
environment_failfast -->|"推奨される対応"| memory_corruption_symptom
environment_failfast -->|"実装を担う"| terminate_process
environment_exit -->|"実装を担う"| terminate_process
native_interop_boundary -.->|"原因になり得る"| memory_corruption_symptom
terminate_process -.->|"推奨される対応"| native_interop_boundary
backgroundservice -.->|"前提とする"| environment_exit
stopapplication -.->|"用いるのは非推奨"| windows_service
backgroundservice -->|"実装を担う"| windows_service
unhandled_exception_handler -->|"用いるのは非推奨"| exception_recovery_attempt
catch_exception_antipattern -.->|"両立しない"| backgroundservice
environment_failfast -.->|"防止する"| external_side_effect
unexpected_exception -->|"で確認できる"| unhandled_exception_handler
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 処理の継続は不変条件を前提とします。
- 処理の継続は失敗単位を前提とします。
- 処理の継続は外部副作用を前提とします。
- catch (Exception)での握りつぶしはゾンビ化の原因になることがあります。
- catch (Exception)での握りつぶしを想定外の例外に用いることは推奨されません。
- プロセスの終了はStackOverflowExceptionに対する本記事の推奨です。
- プロセスの終了はAccessViolationExceptionに対する本記事の推奨です。
- Environment.FailFastはOutOfMemoryExceptionに対する本記事の推奨です。
- AccessViolationExceptionはメモリ破壊の兆候の原因になることがあります。
- Environment.FailFastはメモリ破壊の兆候に対する本記事の推奨です。
- Environment.FailFastはプロセスの終了の実装を担います。
- Environment.Exitはプロセスの終了の実装を担います。
- ネイティブ境界はメモリ破壊の兆候の原因になることがあります。
- プロセスの終了はネイティブ境界に対する本記事の推奨です。
- BackgroundServiceはEnvironment.Exitを前提とします。
- IHostApplicationLifetime.StopApplicationをWindowsサービスに用いることは推奨されません。
- BackgroundServiceはWindowsサービスの実装を担います。
- 未処理例外ハンドラを例外後の状態回復の試みに用いることは推奨されません。
- catch (Exception)での握りつぶしはBackgroundServiceと両立しません。
- Environment.FailFastは外部副作用を防ぎます。
- 想定外の例外は未処理例外ハンドラで確認できます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。