带有和不带throw()的方法/构造函数签名中的c ++,用于自定义异常

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()虚函数中使用?它有什么不同?

谢谢大家.

Kin*_*ard 4

函数签名

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 规范不是编译时检查;它只是程序员通知编译器函数是否应该抛出异常的一种方法。编译器可以使用此信息来对非抛出函数启用某些优化[...]”。