私は非常に簡単な解決策を書きましたが、誰かが笑って、ここに示されているように欠陥を見つけましたhttp://ideone.com/IcWMEf
#include <iostream>
#include <ostream>
#include <functional>
#include <exception>
using namespace std;
// Wrong scope(failure)
class FailBlockT
{
typedef function<void()> T;
public:
T t;
FailBlockT(T t)
{
this->t=t;
}
~FailBlockT()
{
if (std::uncaught_exception())
{
t();
}
}
};
struct Test
{
~Test()
{
try
{
FailBlockT f([]()
{
cout << "failure" << endl;
});
// there is no any exception here, but "failure" is printed.
// See output below
}
catch(...)
{
cout << "some exception" << endl;
}
}
};
int main()
{
try
{
Test t;
throw 1;
}
catch(int){}
return 0;
}
要するに、問題は私のコードがを見るということですstd::uncaught_exception()
。例外がスローされ、通常のデストラクタが実行された場合。そこでスコープの失敗を使用するstd::uncaught_exception()
と、単にスコープから外れるのではなく、例外が原因でオブジェクトのスコープが失われたと見なされます。
通常はスコープを離れるのと、例外がスローされるのとを区別するための良い解決策は考えられません。はい、私はdtorsでスローするのは悪い考えだと知っていますが、例外をスローすることは決してないので、この問題に気付かないのはそのためです。
これを区別/解決するにはどうすればよいですか?