terminate
理論的には、同時に2つの未処理の例外が発生した場合、プログラムが発生するリスクがあります。ただし、これはかなりまれな状況です。
- 例外の準備中にスローする:問題ありません(ただし、期待した例外は発生しません)
- 例外のコピー中にスローする(多くの場合、省略され、回避可能):クラッシュ
- 巻き戻し中に投げる:クラッシュ
- 例外の処理中にスローする(
catch
):罰金(結局のところ、別の例外を再スローするのが一般的です)
したがって、ここで回避できるリスクは、例外のコピーコンストラクターがたまたまスローされる可能性がある場合です。shared_ptr
状態を例外内に含まれる状態に移行することで問題を回避するのは簡単です。コピーは少し「特別」になりますが(元の状態と状態を共有しているため)、適切に文書化されていれば、悲しみを引き起こすことはありません。
より大きなリスクは、スタックの巻き戻し中です。ただし、デストラクタがスローした場合にのみ発生します。
個人的に、私が使用する例外には次のものが含まれます。
- エラーコード(APIが適切に表示/エンコードするために、すべてのエラーメッセージはコードにマップされます。これは中国語/韓国語/日本語で役立ちます)
- いくつかの詳細を含むログメッセージ(問題の原因となったアイテムのID /名前、別の例外を変換するときの元のエラー、役立つものは何でも!)
- 例外がスローされた関数/ファイル/行
- 例外がスローされた時刻
- 追加のメモ(スタックの巻き戻し中に「オンザフライ」で追加)
- 完全なバックトレース(Linux固有の機能を使用)
ここでの唯一の論争の的となる点は、事実上クラッシュする可能性があるため、オンザフライビットです。一方、私はサーバーで作業しているので、クラッシュは簡単に(そして緊急に)修正され、過去5年間は、クラッシュを引き起こさないように十分注意していました(このように;))。
このスキームは、例外をまばらに使用する場合にのみ使用できることは明らかです。タスクごとに定期的に12の例外をスローする場合、パフォーマンスは許容できない可能性があります。一方、主要なコンパイラで使用されているゼロコストモデルは、例外的なパスにすでに厳しいペナルティを課しているため、...