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 件のコメント:
コメントを投稿