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

时间:2018-05-02 11:16:55

标签: c++ exception polymorphism

我创建了一个派生自std :: exception的自定义异常类。

#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;
    }
}   

这个程序在Ubuntu上由g ++ -stdc ++ = 17编译时,会导致异常不会被catch块捕获,即使按引用捕获也应该捕获派生的异常。它调用std :: terminate,即使它发生在try块中,它通过引用捕获它的基类。如果Exception继承自std :: runtime_error并将“test”传递给自己的构造函数中的std :: runtime_error构造函数,则会发生同样的事情。通常解决方案只是使用Exception捕获,但在我的原始代码中,我需要捕获不同类型的异常,所有异常都继承自std :: exception。为什么会这样?参考基地的捕捉不起作用吗?如何使用一个catch块捕获从std :: exception派生的所有异常?

2 个答案:

答案 0 :(得分:5)

在定义cassandra-driver-core-3.0.1.jar netty-common-4.0.33.Final.jar scalate-core_2.11-1.7.1.jar commons-lang3-3.3.2.jar netty-handler-4.0.33.Final.jar scalate-util_2.11-1.7.1.jar guava-16.0.1.jar netty-transport-4.0.33.Final.jar scala-xml_2.11-1.0.1.jar lz4-1.3.0.jar scala-compiler-2.11.2.jar slf4j-api-1.7.10.jar metrics-core-3.1.2.jar scala-library-2.11.2.jar snappy-java-1.0.5.4.jar netty-buffer-4.0.33.Final.jar scala-parser-combinators_2.11-1.0.1.jar zeppelin-cassandra_2.11-0.7.2.jar netty-codec-4.0.33.Final.jar scala-reflect-2.11.2.jar 期间从基类继承时,继承的默认访问修饰符为class。这意味着以下两个定义是等效的:

private

语言不允许 1 您从私有基础 2 引用派生类。例如,以下代码无法编译:

class derived : base { /* ... */ };
class derived : private base { /* ... */ };
int main()
{
    derived d;
    base& b = d; // <== compilation error
}
     

live example on wandbox.org

这就是您的error: 'base' is an inaccessible base of 'derived' base& b = d; ^ 阻止无法处理catch的原因。将您的继承更改为Exception ...

public

...您的原始代码将有效。

live example on wandbox.org

1 请参阅[dcl.init.ref][conv.ptr]

2 除非你在class Exception : public std::exception 本身的范围内。请参阅此live example on wandbox.org

答案 1 :(得分:4)

您需要公开派生自std::exception

class Exception : public std::exception

然后你的output

test

有关此主题的更多详细信息,请参阅Difference between private, public, and protected inheritance