有人可以解释为什么自编的C ++异常,从异常继承返回一个char *而不是一个字符串?
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex;
答案 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
构造函数本身可以抛出异常,这将导致灾难。