假设我有一个RAII类:
class Raii {
Raii() {};
~Raii() {
if (<something>) throw std::exception();
}
};
而且如果我有这个功能:
void foo() {
Raii raii;
if (something) {
throw std::exception();
}
}
这很糟糕,因为在清理第一个异常时我们可能会再次抛出异常,这将终止进程。
我的问题是 - 在清理可能会引发异常的代码中使用 RAII 的好模式是什么?
例如,这是好还是不好 - 为什么?
class Raii {
Raii() {};
~Raii() {
try {
if (<something>) throw std::exception();
}
catch (...) {
if (!std::uncaught_exception())
throw;
}
}
};
请注意,Raii对象始终是栈分配对象-并且这不是析构函数抛出异常的一般问题。