所以我有点困惑,我一直在寻找一种适合从我自己的类型继承std :: exception的方法。现在根据cplusplus.com(我知道这不一定是标准,这就是我要问的原因),std :: exception是一个没有成员的基类。但是,在查看我的标准库(VS 2005)的实现之后,使用两个成员变量明确定义了类std :: exception:
class _CRTIMP_PURE exception
{ // base of all library exceptions
...
private:
const char *_m_what;
int _m_doFree;
};
现在这个标准是将这些成员包含在基类std :: exception中,我的理解是它不是。我的理由是我的派生异常类实际上只需要一个字符串来获取它的信息,因此这个实现可以正常工作。但是,我担心这是非标准的,因此我最好继承std :: exception并自己添加适当的成员+复制/赋值代码。
答案 0 :(得分:6)
std::exception
类定义为:
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
这是您在可替代性方面必须遵守的合同。标准定义了每个成员的具体细节。通常需要考虑的唯一一个是what()
返回“以null结尾的多字节字符串,适合显示为wstring
”。另一部分是遵守并确保throw()
合同。
答案 1 :(得分:2)
要创建自己的异常类,您需要重载以下函数:
virtual const char* what() const throw()
如果查看Visual Studio实现,exception
使用malloc
分配内存来存储字符串。如果该内存不可用,_m_what
将设置为预定义的字符串。
_m_doFree
是一个标志,用于存储是否需要在此内存中调用free
。
答案 2 :(得分:1)
我会看看其他标准例外情况 std :: exception可能是基类,但其他标准异常提供了一些其他功能。
我通常派生自std :: runtime_error