【发布时间】:2018-05-02 11:16:55
【问题描述】:
我创建了一个派生自 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 构造函数,也会发生同样的事情。通常解决方案是只使用异常捕获,但在我的原始代码中,我需要捕获不同类型的异常,所有这些异常都继承自 std::exception。为什么会这样?通过引用基地捕获不起作用吗?如何使用一个 catch 块捕获源自 std::exception 的所有异常?
【问题讨论】:
标签: c++ exception polymorphism