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

如何在catch块中重新抛出抽象类类型的异常?

问题解决:捕获抽象类异常后重新抛出

问题原因

你写的throw e;会尝试创建一个AbstractError类型的副本,但AbstractError是包含纯虚函数的抽象类,无法直接实例化,因此编译器报错。核心问题是对象切片:通过基类引用抛出时,throw e会切片生成基类对象,而抽象类不允许被实例化。

解决方案

直接使用不带参数的throw;语句,它会重新抛出当前捕获的原始异常对象,完全保留原异常的类型和多态特性,不会触发切片问题。

修改后的main函数代码:

int main(int argc, char **argv)
{
    try { foo(argc); }
    catch (const AbstractError &e)
    {
        std::cout << e.toString() << "\n"; // 执行自定义操作
        throw; // 重新抛出原始异常的正确方式
    }
    return 0;
}

补充说明

  • 不带参数的throw;是重新抛出异常的标准写法,它会传递最初抛出的具体异常实例(比如SomeConcreteError或SomeOtherError对象),保持多态行为。
  • 不要直接抛出基类类型对象(如throw e),除非基类非抽象且你明确需要切片,否则会丢失原始异常的类型信息,还可能触发抽象类实例化的错误。

内容的提问来源于stack exchange,提问作者OrenIshShalom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:45:41