fil*_*ble 6 c++ exception class throw
我是c ++的初学者,因此为这个愚蠢的问题道歉.我在这里发帖是因为我在stackoverflow上找不到类似的答案.
我正在逐步完成C++中的异常,而且我正在尝试使用自定义异常,我有这个代码
class MyException: public std::exception{
public:
virtual const char* what() const throw() {
return "something bad happened";
}
};
// class that throws above exception
class canGoWrong {
public:
canGoWrong(){
throw MyException();
}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码由老师展示.构造函数刚刚实现了基类中定义的虚函数exception.我到那儿.
现在,当我尝试使用不同版本进行练习时,我尝试使用自定义函数而不是重新定义虚拟(因为c ++没有严格执行接口的概念,如果我在这里错了,请纠正我.)
我把它写成了
class my_custom_shit_exception: public std::exception {
public:
const char* show() { // I omitted the const throw() here
return "This is an error encountered\n";
}
};
class myclass {
public:
myclass() {
throw my_custom_shit_exception();
}
};
Run Code Online (Sandbox Code Playgroud)
总而言之,我没有发现两种方式的行为差异
public:
const char* show() {
return "This is an error encountered\n";
}
virtual const char* what() const throw() {
return "something bad happened";
}
Run Code Online (Sandbox Code Playgroud)
const throw()在what()虚函数中使用?它有什么不同?谢谢大家.
函数签名
class std::exception {
//...
public:
virtual const char* what() const throw();
//...
};
Run Code Online (Sandbox Code Playgroud)
可以理解为:what是一个虚拟成员函数,std::exception它返回一个指向常量字符(数组)的指针,并且不会修改该对象的成员(因此是 2nd const),并且保证不会在其代码中引发异常。
请注意,异常规范现在已被弃用:相反,从 C++11 开始,有说明noexcept符来声明“保证”不抛出异常的函数。此外,自 C++17 起, thethrow()已成为 的同义词noexcept(true),但行为略有不同。
有关更多详细信息,请参阅的此说明noexcept。
它还说:“请注意,函数上的 noexcept 规范不是编译时检查;它只是程序员通知编译器函数是否应该抛出异常的一种方法。编译器可以使用此信息来对非抛出函数启用某些优化[...]”。