finally
C ++にはないため、コードを例外安全にする場合は、代わりにRAIIデザインパターンを使用する必要があります。これを行う1つの方法は、次のようなローカルクラスのデストラクタを使用することです。
void foo() {
struct Finally {
~Finally() { /* cleanup code */ }
} finalizer();
// ...code that might throw an exception...
}
クリーンアップコードを2回記述する必要がないため、これは単純なソリューションよりも大きな利点です。
try {
// ...code that might throw an exception...
// cleanup code (no exception)
} catch (...) {
// cleanup code (exception)
throw;
}
ローカルクラスソリューションの大きな欠点は、クリーンアップコードでローカル変数に直接アクセスできないことです。したがって、それらにアクセスする必要がある場合は、コードが大幅に肥大化します。
void foo() {
Task* task;
while (task = nextTask()) {
task->status = running;
struct Finally {
Task* task;
Finally(Task* task) : task(task) {}
~Finally() { task->status = idle; }
} finalizer(task);
// ...code that might throw an exception...
}
}
だから私の質問は:両方の利点を組み合わせた解決策はありますか?そのため、a)重複するコードを記述する必要がなく、b)task
最後の例のように、クリーンアップコード内のローカル変数にアクセスできますが、そのようなコードの膨張はありません。