据我了解,RAII 是指在构造函数中获取资源,在析构函数中释放资源。
构造函数获取某些资源时可能会失败,导致异常抛出。 析构函数释放资源时也可能会失败,但出现在析构函数中的异常不能被处理,因此不允许发生异常。
那么用户可以在需要释放错误反馈时调用Exit(),或者当A超出作用域时,让dtor完成工作(例如,A在发生其他异常的情况下被使用)。
构造函数获取某些资源时可能会失败,导致异常抛出。 析构函数释放资源时也可能会失败,但出现在析构函数中的异常不能被处理,因此不允许发生异常。
class A {
A() throw(Ex) { // acquire resources }
~A() throw() { // release resources }
}
如果A类的用户应该知道在A的未初始化过程中发生了错误,那么我可以将未初始化过程外包给一个抛出异常的函数,在析构函数中调用该函数并吞掉异常:
class A {
A() throw(Ex) { // acquire resources }
~A() throw() { try {Release(); } catch(...) {} }
void Release() throw(Ex) { // release resources }
}
那么用户可以在需要释放错误反馈时调用Exit(),或者当A超出作用域时,让dtor完成工作(例如,A在发生其他异常的情况下被使用)。
为了防止多次执行Exit()(首先由用户明确执行,稍后由dtor间接执行),我必须添加一个初始状态:
class A {
bool init;
A() throw(Ex) { init = true; // acquire resources }
~A() throw() { try {Release(); } catch(...) {} }
void Release() throw(Ex) {
if(!init) return;
init = false;
// release resources
}
}
有没有更好的方法可以做到这一点,或者每次资源释放失败并且我想知道时,我都必须实现该模式?
std :: fstream
就这样做了。 - Kerrek SBnoexcept
或noexcept(true)
)之外的异常规范。 - Dietmar Kühl