C++异常返回类型为什么字符*

C++ exception return type why char*

本文关键字:字符 为什么 返回类型 异常 C++      更新时间:2023-10-16

有人可以解释为什么自写的异常C++异常,从异常继承返回字符*而不是字符串?

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex;

来源 : http://www.cplusplus.com/doc/tutorial/exceptions/

由于 std::exception 被设计为所有异常的基类,因此接口的编写方式使得专用化不需要可能抛出的代码。他们可以使用它,但他们不需要它来实现接口。

例如,如果基异常类需要std::string,则 std::out_of_memory 无法从它继承(因为在运行时已经遇到内存不足情况后,构造要传递到构造函数的字符串可能不起作用(。

完全基于 POD 类型的类构造允许将 std::out_of_memory(以及可能在特殊情况下创建的其他异常(作为专用化实现。

这并不意味着你不能在异常中使用 std::string(或其他任何东西(。事实上,实践中的大多数例外都是从 std::logic_error 和 std::runtime_error 派生的,两者都采用 std::string 参数。

注意:除非确实需要它,否则请考虑从 std::runtime_error 或 std::logic_error 继承基异常类。它们是更高级别,直接从 std::exception 继承比大多数情况需要的要多。

myexception继承

std::exception类,该类 http://en.cppreference.com/w/cpp/error/exception/what 定义此虚拟方法:

virtual const char* what() const;

不能更改派生类中虚函数的签名。 std::exception具有这样的签名std::string因为构造函数本身可能会引发异常,这将导致灾难。