当前位置: 首页 > 知识库问答 >
问题:

无法通过引用std::exception捕获从std::exception派生的类

百里涛
2023-03-14
#include <iostream>

class Exception : std::exception {
public:
    const char* what() const noexcept override {
        return "test";
    }
};

int main() {
    try {
        throw Exception();
    } catch (std::exception& e) {
        std::cout << e.what() << std::endl;
    }
}   

共有1个答案

富锦
2023-03-14

在定义期间从基类继承时,继承的默认访问修饰符是private。这意味着以下两个定义是等价的:

class derived : base { /* ... */ };
class derived : private base { /* ... */ };

该语言不允许1从私有基2引用派生类。作为示例,以下代码不编译:

int main()
{
    derived d;
    base& b = d; // <== compilation error
}
error: 'base' is an inaccessible base of 'derived'
     base& b = d;
               ^

wandbox.org上的现场示例

这就是catch块无法处理异常的原因。将继承更改为public...

class Exception : public std::exception

...你的原始代码就可以工作了。

wandbox.org上的现场示例

 类似资料:
  • 我的基本想法是从std::tuple派生我自己的类,以便在里面获得一些helper类型,如下所示: 现在我尝试使用如下代码: 线条 不能用GCC5.2.0编译,而是用GCC6.1.0编译。这有点神秘,因为我记得元组的构造函数确实是显式的。为什么这适用于GCC6.1.0?但这不是我寻找的问题:-) 另一个提示:我遇到问题的代码似乎是用Clang3.5.0编译的。

  • 我感兴趣的是这是否是标准强制的,是否被某个编译器违反了。我的观察是: > Visual Studio 2015/2017(with/ehsc):throw()函数中的堆栈没有展开(不调用d-tors),但异常退出函数,并被try/catch捕获。没有调用STD::Terminate。 gcc(6.3.0)中,throw()函数中的堆栈被解除,但随后调用std::terminate(try/catc

  • 我会期望std::reference_wrapper在将non-const转换为const方面可以作为参考,例如: 下面的代码在MSVC和GCC中编译并运行良好,但在Clang上则不行。我只是不明白为什么,它是UB,还是实际上是关于Clang编译器的问题? 仅在Clang上,显示以下错误: https://wandbox.org/permlink/FSY4tCvE9B17hbVn

  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue

  • 问题内容: 我正在使用SWIG从Java访问C ++代码。 公开非常量引用传递的std :: string参数的最简单方法是什么? 我有参考暴露为Java数组传递原语,感谢typemaps.i,和s ^暴露,感谢std_string.i。但是非const std :: string&被公开为不透明指针类型。 当前: 期望的: 更新 :我找到 了 解决方案,如下所述。但是,它花费了超过几秒钟的时间。

  • 我使用mysql C++connector和这段(稍微简化了一点)代码。 连接器应该抛出SQL::SqlException,它派生自std::Exception并具有一些附加方法,如。 抛出的异常在第二个块中捕获,但可以成功转换为(并用作)。 更奇怪的是,不同可执行文件中的类似代码会像预期的那样捕获。它们之间的区别在于,第一个是在一个共享对象(.so)中,该对象加载了。