【问题标题】:c++ overriding exception::what()c++ 重写异常::what()
【发布时间】:2021-02-22 10:03:00
【问题描述】:

我有一个自定义异常

class RenterLimitException : public std::exception
{
public:
    const char* what();
};

覆盖what() 的正确方法是什么?现在,我在头文件中创建了这个自定义,并希望覆盖我的 cpp 文件中的 what()。 我的功能定义如下:

const char* RenterLimitException::what(){
    return "No available copies.";
}

但是,当我使用 try/catch 块时,它不会打印我给函数 what() 的消息,而是打印 std::exception 我的 try/catch 块是这样的:

try{
   if (something){
            throw RenterLimitException();}
}
catch(std::exception& myCustomException){
        std::cout << myCustomException.what() << std::endl;
    }

是因为我的 try/catch 块还是我的 what() 函数? 提前致谢

【问题讨论】:

  • 您的what 方法具有wrong signature
  • @G.M.所以应该是virtual const char* RenterLimitException::what() const throw(){ return "No available copies."; }?
  • 一般来说,您应该使用override 关键字,它会警告您您的实现不会覆盖基类中的what() 方法。
  • 在现代 C++ 中,使用 noexcept 说明符而不是已弃用的 throw() 异常说明。

标签: c++ exception


【解决方案1】:

不是what 方法的正确签名,您应该按照以下完整程序使用const char * what() const noexcept override

#include <iostream>

class RenterLimitException : public std::exception {
public:
    const char * what() const noexcept override {
        return "No available copies.";
    }
};

int main() {
    try {
        throw RenterLimitException();
    } catch (const std::exception& myCustomException) {
        std::cout << myCustomException.what() << std::endl;
    }
}

请注意用于覆盖的特定签名以及在main 中捕获const 异常(尽管不是绝对必要但一个好主意)。特别要注意override 说明符,它会导致编译器实际上检查您指定的函数是基类提供的虚拟函数。

所述程序按预期打印:

No available copies.

【讨论】:

  • 你应该通过 const 引用 stackoverflow.com/questions/2145147/…
  • 使用override 而不是virtual
  • 完成了。两个好点,bods,感谢输入。
  • 我也想问一下,如果我有10个这样的自定义异常,一个catch就可以全部抛出?
  • @Alex 如果他们都公开派生自std::exception,是的,这将抓住他们。阅读有关动态多态性的更多信息。
【解决方案2】:

试试这个

class RenterLimitException : public std::exception
{
public:
    const char* what() const noexcept;
};

const 是函数签名的一部分。为了避免以后出现这种错误,你也可以养成使用override的习惯

class RenterLimitException : public std::exception
{
public:
    const char* what() const noexcept override;
};

如果虚函数的签名错误,override 会给你一个错误。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2013-08-05
    相关资源
    最近更新 更多