class Derived : private Base {
Other member;
public:
Derived() : Base(0), member(1) {
いろいろ準備
if ( !準備おっけぃ ) throw bad_derived_err;
}
};
ここで Base,Other のコンストラクト失敗はそれぞれ bad_base_err, bad_other_err
がthrowされるとしましょうか。
Derivedの利用者コードはどんなんなっちゃうでしょう:
try {
Derived d;
...
} catch ( bad_base_err ex) {
...
} catch ( bad_other_err ex) {
...
} catch ( bad_derived_err ex) {
...
}
...ちょっとマテ。
利用者が本来知らんでもえぇBaseはおろか
知れるはずのないOtherにまつわる例外も捕まえんとあかんのかい!?
だったらコレ↓の方がまだマシちゃうんかい? ってことですよ。
// 例外を使わぬアナクロな方法
class Derived : private Base {
Other member;
public:
Derived() : Base(0), member(1) {
いろいろ準備
}
bool is_ok() const {
return Base::is_ok() && member.is_ok() && 準備おっけい;
}
};
// 利用者
Derived d;
if ( !d.is_ok() ) { 残念っしたー }
function-try-blockがあればそこらへんがスッキリするです。
// function-try-block で例外を差し替える
class Derived : private Base {
Other member;
public:
Derived() try : Base(0), member(1) {
いろいろ準備
if ( !準備おっけぃ ) throw bad_derived_err;
} catch ( bad_base_err ex) {
throw bad_derived_err(親の不始末);
} catch ( bad_other_err ex) {
throw bad_derived_err(おなかイタイ);
}
};
// 利用者
try {
Derived d;
...
} catch ( bad_derived_err ex) {
残念っしたー
}
これならコンストラクタで例外投げるのもアリちゃいますかしらね。