1

次のコードは例外処理に関するものです。私は出力を得ました:

Botch::f()
I'll be back!

フルーツが釣れないのはなぜ?ありがとう!

これは無視してください。私は十分な詳細を提供したと思います。

#include <exception>
#include <iostream>
using namespace std;

void terminator() {
    cout << "I'll be back!" << endl;
    exit(0);
}

void (*old_terminate)() = set_terminate(terminator);

class Fruit {};

class Botch {
public:
    void f() throw(Fruit, bad_exception) {
        cout << "Botch::f()" << endl;
        throw Fruit();
    }
    ~Botch() { throw 'c'; }
};

int main() {
    try{
        Botch b;
        b.f();
    } catch(Fruit&) {
        cout << "inside catch(Fruit)" << endl;
    } catch(bad_exception&) {
        cout << "caught a bad_excpetionfrom f" << endl;
    }
}
4

4 に答える 4

3

Fruit 例外のスタックの巻き戻し中に、(Botchデストラクタから) 別の例外をスローしたためです。そのため、代わりにターミネーターが呼び出されました。これが、デストラクタから例外をスローすることが悪い考えである理由です。

于 2013-04-16T13:11:54.583 に答える
2

Fruitコードがその catch 句に到達しないため、キャッチされません。のtryブロックではmain、 への呼び出しb.f()によってタイプ の例外がスローされFruitます。応答として、コードBotchは catch 句に入る前にオブジェクトを破棄します。のデストラクタがBotch別の例外をスローし、それが への呼び出しをトリガーしますterminate

于 2013-04-16T13:12:21.840 に答える
0

b.f()main で呼び出されると、 aFruitがスローされます。その後、実行はtryブロックを離れ、catch ハンドラーがそれをキャッチする前にFruitb破棄され'c'てスローされます。がアクティブな間に 2 番目の例外をスローするFruitと、catch ハンドラに関係なく終了します。
これが、デストラクタから決してスローしない理由です。

于 2013-04-16T13:14:09.357 に答える
0

プログラムの流れは次のとおりです。

try{
        Botch b;
        b.f();
        //-> exception of class Fruit has been thrown
        //-> Stack unwinding: during stack unwinding object b, 
        //which is on stack is destroyed, and its destructor is called
        //-> this destructor ~Botch() { throw 'c'; } throws another exception 
        //and this caused call of your terminator()
    } catch(Fruit&) {  // so we are never here
于 2013-04-16T13:22:22.413 に答える