注: RedHat Linux 6.3 で gcc 4.4.7 を使用しています。以下の例の質問は、A::doSomething()
例外がデストラクタからスローされるべきかどうかではなく、スローされた最初の例外に対して GCC が行うことに関するものです。
次のコードでは、関数は 2 つの例外A::doSomething()
で終了します。デストラクタlogic_error
の 2 番目はfromを上書きしているようです。プログラムからの出力を以下に示します。logic_error
~A()
logic_error
A::doSomething()
logic_error
私の質問は、によって投げられたのはどうしたことですかA::doSomething()
。それを回復する方法はありますか?
#include <iostream>
#include <stdexcept>
#include <sstream>
using namespace std;
class A
{
public:
A(int i):x(i) {};
void doSomething();
~A() {
cout << "Destroying " << x << endl;
stringstream sstr;
sstr << "logic error from destructor of " << x << " ";
throw logic_error(sstr.str());
}
private:
int x;
};
void A::doSomething()
{
A(2);
throw logic_error("from doSomething");
}
int main()
{
A a(1);
try
{
a.doSomething();
}
catch(logic_error & e)
{
cout << e.what() << endl;
}
return 0;
}
出力は次のとおりです。
Destroying 2
logic error from destructor of 2
Destroying 1
terminate called after throwing an instance of 'std::logic_error'
what(): logic error from destructor of 1
Aborted (core dumped)