You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:52:09