一个被捕获的std :: exception是否可以使what()为NULL?
检查e.what()是否在开销之下?
//...
}
catch (const std::exception& e)
{
std::string error;
if(e.what())
error = e.what();
}
答案 0 :(得分:13)
字符串的内容是实现定义的,所以我猜答案是肯定的。
编辑:保护。标准说:
virtual const char* what() const throw();
5 Returns: An implementation-defined NTBS.
所以它必须返回一个字符串,而不仅仅是一个指针。字符串不能是NULL
。正如其他人已经指出的那样,很容易导出what()
确实返回NULL
的异常,但我不确定这些东西如何符合标准一致性。当然,如果你在自己的异常类中实现what(),我会认为允许它返回NULL是非常糟糕的做法。
更多强>
有关what()
是否可以返回NULL以及类似的令人兴奋的问题的进一步问题,请参阅Extending the C++ Standard Library by inheritance?
答案 1 :(得分:5)
如果某人继承了std :: exception并重写了返回NULL的内容,那么这是可能的。
class CMyException : public std::exception
{
...
virtual const char * what () const {return NULL;}
};
尽管Neil在标准中有很好的发现,但检查NULL可能仍然很好。虽然std :: exception状态的子类的规范不应该返回NULL,但编译器中没有任何内容可以强制执行此操作,并且根据语言,上述代码仍然是合法的。
这可能是使用断言的理想情况......
assert(except.what() != NULL);
或
if (except.what() != NULL)
{
... normal processing ...
}
else
{
assert(false);
}
因为这种情况可能永远不会发生,并且您认为它不应该发生,但是当您的假设被证明是错误时,仍然想知道(在调试模式下)。然后你可以解决你的错误假设或解决可能违背你的假设的错误代码(确保what()不返回NULL)。
答案 2 :(得分:2)
当然可以是NULL:
class myexception: public exception
{
virtual const char* what() const throw()
{
return NULL;
}
} myex;
答案 3 :(得分:0)
正如其他许多人所指出的,what()
不应返回空指针,但可能。空测试的运行时开销仅在特殊情况下发生,其中可能不太重要。
无论如何,我建议至少使用assert
。
如果代码空间也是一个问题,希望assert
,您的测试,代码审查和其他质量检查将足够完整,以便在您发货之前追踪任何违规的,不合规的例外。
另外,请注意本身可以抛出的异常处理代码(例如,正如其他人所说,在处理std::string
异常时使用std::bad_alloc
分配内存。)