Зависит от того, что вы подразумеваете под «продолжить». Независимо от того, какая операция требует, ресурс потерпит неудачу: вот что означает «требует». Поэтому, если вы хотите продолжить после ошибки, вы можете написать код:
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" - это в основном один и тот же код, то рефакторинг в функцию и вызов ее из обоих мест. Ваша функция делает довольно много в этот момент.