我有一个功能,我希望有强大的异常保证:
class X {
/* Fields and stuff */
void some_function() {
vector1.push_back(/*...*/); // May Throw
vector2.push_back(/*...*/); // May Throw
vector3.push_back(/*...*/); // May Throw
vector4.push_back(/*...*/); // May Throw
}
};
我能想到使其具有强大的异常保证的唯一方法如下:
class X {
/* Fields and stuff */
void some_function() {
try { vector1.push_back(/*...*/);};
catch (Vector1PushBackException) {
throw Vector1PushBackException;
}
try { vector2.push_back(/*...*/);};
catch (Vector2PushBackException) {
vector1.pop_back();
throw Vector2PushBackException;
}
try { vector3.push_back(/*...*/);};
catch (Vector3PushBackException) {
vector1.pop_back();
vector2.pop_back();
throw Vector3PushBackException;
}
try { vector4.push_back(/*...*/);};
catch (Vector4PushBackException) {
vector1.pop_back();
vector2.pop_back();
vector3.pop_back();
throw Vector4PushBackException;
}
}
};
但是,这真的很丑陋且容易出错!有没有比我上面提到的更好的解决方案?我可以听到有人告诉我我需要使用 RAII,但我无法弄清楚如何使用,因为pop_back
在函数正常返回时不能进行操作。
我也希望任何解决方案都是零 - 快乐道路上的开销;我真的需要尽可能快的快乐之路。