次のコードがあります。
#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;
}
さて、質問を述べる前に、このコードは悪い習慣であることを指摘したいと思います (たとえば、コンストラクターから例外をスローすると、オブジェクトが完全に作成されないため、デストラクタが呼び出されず、メモリ リークやメモリ リークが発生する可能性があります)。その他の問題)。
さて、メインの順番はこれです:
印刷
"Entering try...catch block"
。のコンストラクターの呼び出し
A
、印刷"A::A()"
B
のコンストラクター、printingを呼び出し"B::B()"
、例外をスローします。例外がスローされ、行
"Exiting try...catch block"
は印刷されません。ブロックが終了するので、A
のデストラクタが呼び出されます。A
のデストラクタは"A::~A()"
、別の例外を出力してスローします。
2 番目の例外 (5) により、メインはcatch
ブロックに入る前に例外をスローします。
A
私の質問はこれです-クラスを変更せずに、メインで2番目の例外をキャッチする方法はありB
ますか?
try-catch
ブロック全体とブロック内の両方catch
を別のtry-catch
ブロックで囲おうとしましたが、うまくいきませんでした。
ありがとう。