我创建了一个从std::exception派生的自定义异常类。
这个程序在Ubuntu上使用"g++ -stdc++=17"编译时,即使通过引用捕获,也无法将异常捕获到catch块中。它调用了std::terminate,尽管它发生在一个通过引用捕获其基类的try块中。如果Exception从std::runtime_error继承,并在自己的构造函数中将"test"传递给std::runtime_error的构造函数,情况也是一样的。通常的解决方法是只使用Exception进行捕获,但在我的原始代码中,我需要捕获不同类型的异常,它们都继承自std::exception。为什么会发生这种情况?通过引用捕获基类不起作用吗?如何使用一个catch块捕获所有派生自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的异常?
derived
的friend
中捕获一个作为std::exception
的Exception
。 - Peter