c ++异常返回类型为什么char *

时间:2014-12-10 15:24:47

标签: c++ string pointers exception char

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

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

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

2 个答案:

答案 0 :(得分:5)

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

例如,如果基本异常类需要std::string,则std :: out_of_memory无法继承它(因为在运行时已经遇到out-out之后,构造一个传递给构造函数的字符串可能不起作用 - 记忆条件)。

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

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

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

答案 1 :(得分:0)

myexception继承自std::exception类,用于定义此虚拟方法http://en.cppreference.com/w/cpp/error/exception/what

virtual const char* what() const;

您无法在派生类中更改虚函数的签名。 std::exception具有此类签名,因为std::string构造函数本身可以抛出异常,这将导致灾难。