我对 C++ 很陌生,但我想确保在向 Microsoft 报告错误之前我没有做错什么。
这是一些示例代码:
#include <system_error>
using namespace std;
class Test
{
public:
~Test()
{
throw system_error(5, system_category());
}
};
Test test;
void testfunc()
{
throw system_error(5, system_category());
}
void main()
{
try
{
testfunc();
}
catch ( const system_error& e)
{
}
}
现在,我希望 Windows 会说“运行时已请求程序以意外方式退出”。但是,我得到一个“称为纯虚函数”的错误。通过一点调试,我注意到当静态类析构函数获取std::system_category
引用时,::name
和::message
成员是纯虚拟的。但是,当它在 中构造时testfunc()
,那些 vtable 指针指向有效函数。
system_error
我的问题是,以这种方式构建异常,我做错了什么吗?我有一些基本上在做的代码throw system_error(GetLastError(), system_category());
。这恰好在静态析构函数中执行,我得到了一个名为 error 的纯虚函数。
要从 Windows 的GetLastError()
函数中抛出异常,我应该以不同的方式构建我的异常,还是这是 msvc11 的 C++ 运行时中的错误?
编辑
我的问题有点混乱。我的实际代码比这个例子更复杂,我实际上没想到我的析构函数之一会抛出。我的析构函数必须调用一个可能抛出的函数。如果我将代码更改为:
~Test()
{
try
{
callSomeFuncThatCouldThrow();
}
catch ( … ) { }
}
我仍然会得到纯虚函数调用错误。这是因为当 system_error 被构造(在 中callSOmeFuncThatCouldThrow()
)时,它会尝试使用我给它的::message
成员,这会导致错误。system_category