「進む」が何を意味するかによります。リソースを必要とする操作はすべて失敗します。それが「必要」の意味です。したがって、エラーの後で続行したい場合は、次のようなコードを書くことになるかもしれません:
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
}
「v を使用」と「w を使用」が基本的に同じコードである場合は、関数にリファクタリングし、両方の場所から呼び出します。この時点で、関数はかなり多くのことを行っています。