何か問題が発生した場合のクリーンアップにRAIIを使用しているクラスがあります。これは、クラスに作業が完了したかどうかを示すフラグが含まれていることを意味します。コンストラクターが呼び出されたときにこのフラグが設定されていない場合、クラスはクリーンアップタスクを実行し、ログメッセージを生成します。今、私はこのクラスをもう一歩賢くしたいと思います。つまり、エラーが発生したのか、作業が中止されたのか(つまり、例外がスローされてデストラクタが呼び出されたのか)、または誰かがこのクラスを誤用して、決して実際に作業を終了しました。これは、例外がアクティブであるかどうかをデストラクタで確認する必要があることを意味します。見つかった場合は、ログメッセージを生成し、例外の内容を出力してから再スローする可能性があります。こんな感じだと思います。
Foo::~Foo () {
try { /* do not know what to put here */ }
catch( const std::exception & ex ) {
// produce error in log
throw;
}
catch( ... ) {
// produce some other log message
throw;
}
}
try
ただし、デストラクタが呼び出される前に例外がすでにアクティブであり、ブロックから発生していないため、これが機能するかどうかはわかりません。また、私はthrow;
デストラクタの内部を使用しており、この時点で例外をスローすることは本当に悪い考えです。したがって、このケースがこのルール(私にはわかりません)の例外(しゃれは意図されていません)であることが標準で明確に保証されていない限り、私はそれを行いません。
それで、これはまったく可能ですか、それとも他の方法でこの状況に対処する必要がありますか?