如何在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
相关产品推荐
相关产品推荐

