【发布时间】:2016-07-21 22:52:55
【问题描述】:
假设我有 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 对象始终是堆栈分配的对象 - 这不是析构函数问题的一般抛出。
【问题讨论】:
-
这与“如果我有一个析构函数可以抛出的类,我如何防止终止”的更一般的情况并没有什么不同。我认为除了“析构函数应该不抛出”之外没有什么好的答案。
-
没有析构函数做一些工作就没有 RAII。我真的希望有一些事情可以做。根据 std::uncaught_exception 说点什么,例如,您可以在其中检测是否有异常在进行中。