我创建了一个派生自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派生的所有异常?
答案 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 }
这就是您的error: 'base' is an inaccessible base of 'derived'
base& b = d;
^
阻止无法处理catch
的原因。将您的继承更改为Exception
...
public
...您的原始代码将有效。
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。