一个捕获的std::exception是否可能有what()为NULL的情况?
下面对e.what()进行检查会不会增加开销?
//...
}
catch (const std::exception& e)
{
std::string error;
if(e.what())
error = e.what();
}
virtual const char* what() const throw();
5 Returns: An implementation-defined NTBS.
所以它必须返回一个字符串,而不仅仅是一个指针。并且字符串不能为NULL
。正如其他人所指出的那样,很容易推导出异常,其what()
确实返回NULL
,但我不确定这些事情如何符合标准一致性。当然,如果您正在自己的异常类中实现what()
,允许其返回NULL会被认为是非常糟糕的做法。 class CMyException : public std::exception
{
...
virtual const char * what () const {return NULL;}
};
assert(except.what() != NULL);
或者
if (except.what() != NULL)
{
... normal processing ...
}
else
{
assert(false);
}
因为这是一种可能永远不应该发生的情况,您假设它不应该发生,但仍希望在调试模式下知道当您的假设被证明错误时。然后,您可以纠正您的错误假设或解决可能违反您假设的不正确代码(确保what()不返回NULL)。
class myexception: public exception
{
virtual const char* what() const throw()
{
return NULL;
}
} myex;
正如其他人指出的那样,what()
不应该返回空指针,但它可能会。只有在异常情况下才会产生空测试的运行时开销,这种情况下,它可能不太重要。
无论如何,我建议至少使用一个assert
。
如果代码空间也是一个问题,希望assert
、您的测试、代码审查和其他QA足够完整,以便在发货之前跟踪到任何违规的异常。
此外,要小心可以自己抛出异常处理代码(例如,像其他人注意到的那样,在处理std::bad_alloc
异常时分配内存的std::string
)。