c ++异常,what()可以为NULL吗?

时间:2009-06-24 13:46:33

标签: c++ exception

一个被捕获的std :: exception是否可以使what()为NULL?

检查e.what()是否在开销之下?

//...
}
catch (const std::exception& e)
{
  std::string error;
  if(e.what())
    error = e.what();
}

4 个答案:

答案 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分配内存。)