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

Net*_*zen 8 c++ exception

捕获的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++标准库?

  • @Net Citizen - 我实际上会对系统中所有异常类进行代码审查,并确保它们不返回NULL.在给定的系统中可能没有那么多,并且您可以通过预先做一些工作来节省大量多余的代码. (4认同)
  • @JaredPar返回字符串涉及内存分配,如果您尝试报告内存分配失败,这可能是不合需要的. (2认同)
  • 关键是要有适当的继承,必须保留基类承诺.因此,如果基类函数承诺永远不会返回NULL(这里似乎是这种情况),任何派生类必须保证相同,否则继承是不正确的(损坏). (2认同)

Dou*_* T. 5

如果有人继承了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).