捕获的std :: exception是否可以使what()为NULL?
检查e.what()是否低于开销?
//...
}
catch (const std::exception& e)
{
std::string error;
if(e.what())
error = e.what();
}
Run Code Online (Sandbox Code Playgroud)
小智 13
字符串的内容是实现定义的,所以我猜答案是肯定的.
编辑:保持那个.标准说:
virtual const char* what() const throw();
5 Returns: An implementation-defined NTBS.
Run Code Online (Sandbox Code Playgroud)
所以它必须返回一个字符串,而不仅仅是一个指针.并且字符串不能NULL.正如其他人已经指出的那样,很容易得出what()确实返回的异常NULL,但我不确定这些东西如何符合标准一致性.当然,如果你在自己的异常类中实现what(),我会认为允许它返回NULL是非常糟糕的做法.
更多:
有关是否what()可以返回NULL以及类似的令人兴奋的问题的进一步问题,请参阅通过继承扩展C++标准库?
如果有人继承了std :: exception并重写了返回NULL的内容,那么这是可能的.
class CMyException : public std::exception
{
...
virtual const char * what () const {return NULL;}
};
Run Code Online (Sandbox Code Playgroud)
尽管Neil在标准中有很好的发现,但检查NULL可能仍然很好.尽管std :: exception状态的子类的规范不应该返回NULL,但编译器中没有任何内容可以强制执行此操作,并且上述代码仍然是合法的.
这可能是使用断言的理想情况......
assert(except.what() != NULL);
Run Code Online (Sandbox Code Playgroud)
要么
if (except.what() != NULL)
{
... normal processing ...
}
else
{
assert(false);
}
Run Code Online (Sandbox Code Playgroud)
因为这是一个可能永远不会发生的事情,并且你认为它不应该发生,但是当你的假设被证明是错误的时候仍然想知道(在调试模式下).然后你可以解决你不正确的假设或解决可能违背你的假设的错误代码(确保what()不返回NULL).