取决于您所说的“继续”是什么意思。任何需要资源的操作都会失败:这就是“需要”的意思。因此,当您想在出现错误后继续时,您可能最终会编写如下代码:
void something_using_RAII(thingummy &t) {
vector<int> v(t.size_required);
// do something using v
}
...
for each thingummy {
try {
something_using_RAII(this_thingummy);
} catch(const std::bad_alloc &) {
std::cerr << "can't manage that one, sorry\n";
}
}
这就是为什么你应该只在有一些值得你做的事情时才捕获异常(在这种情况下,报告失败并继续下一个事情)。
如果您想在失败时重试,但前提是构造函数失败,而不是其他任何失败:
while(not bored of trying) {
bool constructor_failed = true;
try {
vector<int> v(LOTS);
constructor_failed = false;
// use v
} catch(...) {
if (!constructor_failed) throw;
}
}
这或多或少是如何std::new_handler
工作的——在类似循环的 catch 子句中调用处理程序,尽管不需要标志。
如果您想在失败时尝试不同的资源:
try {
vector<int> v(LOTS);
// use v
} catch(...) try {
otherthing<int> w(LOTS);
// use w
} catch(...) {
// failed
}
如果“use v”和“use w”基本上是相同的代码,那么重构为一个函数并从两个地方调用它。在这一点上,您的功能正在做很多事情。