如何捕获所有std::bad_expected_access模板类的实例化异常?
捕获所有std::bad_expected_access模板实例的方法
要捕获std::bad_expected_access的任意实例化版本,最直接且符合C++标准的方案是利用它的继承特性:所有std::bad_expected_access<E>模板实例都继承自std::exception,因此捕获std::exception的引用即可覆盖该模板的所有实例。
代码实现示例
#include <expected> #include <exception> #include <iostream> int main() { try { // 可能抛出任意std::bad_expected_access实例的代码 std::expected<int, std::string> exp = std::unexpected("出错了"); exp.value(); // 此处会抛出std::bad_expected_access<std::string> } catch (const std::exception& e) { // 捕获所有std::bad_expected_access实例及其他std::exception子类异常 std::cout << "捕获到异常:" << e.what() << std::endl; // 若需确认是否为std::bad_expected_access系列异常(需开启RTTI) if (dynamic_cast<const std::bad_expected_access<void>*>(&e) != nullptr) { std::cout << "该异常属于std::bad_expected_access模板实例" << std::endl; } } return 0; }
补充说明
- C++标准并未为
std::bad_expected_access的不同实例化版本提供统一的非模板基类,因此无法直接通过捕获特定模板基类覆盖所有实例。 - 若代码中不会抛出其他
std::exception子类异常,直接捕获std::exception&即可满足需求;若需区分异常类型,可结合dynamic_cast或typeid判断(依赖RTTI支持)。
内容的提问来源于stack exchange,提问作者Graznarak
相关产品推荐
相关产品推荐

