人々は、デストラクタからの例外をスローすることにかなり強く反対しています。例としてこの答えを取り上げてください。std::uncaught_exception()
他の例外が原因でスタックを巻き戻しているかどうかを移植可能に検出するために使用できるかどうか疑問に思います。
デストラクタに意図的に例外をスローしていることに気づきました。2つの可能なユースケースに言及するには:
- バッファのフラッシュを伴うリソースのクリーンアップ。これにより、失敗は出力の切り捨てを意味する可能性があります。
std::exception_ptr
別のスレッドで発生した例外を含む可能性のあるを保持しているオブジェクトの破壊。
これらの例外的な状況を単に無視することは、明らかに間違っていると感じます。また、例外をスローすることにより、デストラクタ自体がに書き込んでいる場合よりも、一部の例外ハンドラがより有用なコンテキスト情報を提供できる可能性がありますstd::cerr
。さらに、失敗したすべてのアサーションに対して例外をスローすることは、単体テストアプローチの重要な部分です。その場合、エラーメッセージの後に無視されたエラー条件が続くと機能しません。
だから私の質問は、別の例外が処理されているときを除いて例外をスローしても大丈夫ですか、それともそれをしない理由がありますか?
これをコードに入れるには:
Foo::~Foo() {
bool success = trySomeCleanupOperation();
if (!success) {
if (std::uncaught_exception())
std::cerr << "Error in destructor: " << errorCode << std::endl;
else
throw FooOperationFailed("Error in destructor", errorCode);
}
}
私の知る限り、これは安全であり、多くの場合、例外をまったくスローしないよりも優れているはずです。しかし、それを確認したいと思います。