2012/03/01

例外は参照渡しで受け取る

大本ネタは「More Effective C++」§13。

catch節で例外オブジェクト受け取るには、ポインタ、値、参照渡しの3つの方法がある。
結論は参照渡しで受け取るのがベスト

ポインタ渡し

効率が良いが、ポインタが指し示す例外オブジェクトの保証が必要。
void func() {
  exception e;  // ローカル。スコープから出たら破棄される。
  ...
  throw &e; // 破棄されるオブジェクトのポインタを投げる事になる。
}
(受け取った時)例外オブジェクトは誰が破棄するのか不透明。
static exception e;
throw &e;
throw new exception;

値渡し

例外が発生するたびに2回コピーされる(ので生成処理が2回発生する)
基底クラスのオブジェクトとして受け取ると、派生クラスのデータは欠落する。

参照

例外のコピーは1回で済む。派生クラスのデータも欠落しない。
try {
  throw exception();
}
catch (exception& e) {
  cerr << e.what() << endl;
}

参考/引用

0 件のコメント:

コメントを投稿