3

次のコードがあります。

#include <iostream>
using namespace std;

class A {
public:
    A()  { cout << "A::A()" << endl;}
    ~A() { cout << "A::~A()" << endl; throw "A::exception";}
};

class B {
public:
    B()  { cout << "B::B()" << endl; throw "B::exception";}
    ~B() { cout << "B::~B()";}
};

int main() {
    try {
        cout << "Entering try...catch block" << endl;
        A   objectA;
        B   objectB;
        cout << "Exiting try...catch block" << endl;
    } catch (char const * ex) {
        cout << ex << endl;
    }
    return 0;
}

さて、質問を述べる前に、このコードは悪い習慣であることを指摘したいと思います (たとえば、コンストラクターから例外をスローすると、オブジェクトが完全に作成されないため、デストラクタが呼び出されず、メモリ リークやメモリ リークが発生する可能性があります)。その他の問題)。

さて、メインの順番はこれです:

  1. 印刷"Entering try...catch block"

  2. のコンストラクターの呼び出しA、印刷"A::A()"

  3. Bのコンストラクター、printingを呼び出し"B::B()"、例外をスローします。

  4. 例外がスローされ、行"Exiting try...catch block" は印刷されません。ブロックが終了するので、Aのデストラクタが呼び出されます。

  5. Aのデストラクタは"A::~A()"、別の例外を出力してスローします。

2 番目の例外 (5) により、メインはcatchブロックに入る前に例外をスローします。

A私の質問はこれです-クラスを変更せずに、メインで2番目の例外をキャッチする方法はありBますか?

try-catchブロック全体とブロック内の両方catchを別のtry-catchブロックで囲おうとしましたが、うまくいきませんでした。

ありがとう。

4

1 に答える 1