gpt4 book ai didi

c++ - 从 catch block 重新抛出异常时丢失异常类型

转载 作者:IT老高 更新时间:2023-10-28 22:36:00 29 4
gpt4 key购买 nike

今天我在 catch block 中发现了一个错误:

catch (const exception& e){
// do something
// throw e; <-- bug!
throw; // <-- right thing to do
}

基本上,如果我重新抛出异常 e 显式,我会得到一个新的 std::exception 重构,实际上是来自 what() 方法是默认的 std::string,而不是我自定义构建的消息。

解释是什么?我以为 throw; 只是 throw ExceptionJustCaught; 的简写。

最佳答案

异常对象有点特殊。它们是在内存中的一个特殊位置构建的,它们的生命周期取决于它们被捕获的 catch block 。

如果你说throw e;,原始异常的生命周期在catch block 的末尾结束,你通过复制e抛出一个新的异常,从而产生一个经典的 slicing 问题:因为 e 是对动态类型通常比 std::exception 更多派生的对象的多态引用,你最终会切掉对象的派生部分。

相比之下,throw; 是一个特殊的语句,它重新激活原始异常,使其不再被捕获,并且它的生命周期 not 在结束时结束 block 了。事实上,如果您通过非常量引用捕获,您可以继续修改异常对象并重新抛出,从而将状态更改传递到较低的捕获 block 。但请记住,重新抛出与抛出新异常不同!

关于c++ - 从 catch block 重新抛出异常时丢失异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12548022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com