閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

ローカルクラスを使用して関数の終了処理を必ず呼び出す

とある関数が終了する時に必ず実行したい処理がある時に、その関数の中で return やら throw やらで途中で関数を抜けてしまう部分が複数あるとします。そういった時に、その return なりなんなりの前でその都度「必ず実行したい処理」を書くというのは、非常に非効率です。 コピペはバグの温床。

そこで、ローカルクラスのデストラクタに、この「必ず実行したい処理」を書いて、関数が終了した時にこれを呼び出す、というイディオムがあります。

>

void test()
{
struct temporary
{
~temporary()
{
cout << "destroy" << endl;
}
} t;

if(rand()%4 == 3)
{
cout << "nantoka error" << ends;
return;
}

if(rand()%4 == 1)
{
throw runtime_error("hogehoge error");
}
}
void f()
{
try
{
test();
}
catch(exception& e)
{
cout << e.what() << ends;
}
}
int main(int, char*[])
{
for(int i = 0; i < 10; ++i)
{
f();
}
}