gpt4 book ai didi

c++ - 为什么重新抛出的异常没有按预期工作?

转载 作者:太空狗 更新时间:2023-10-29 21:17:47 27 4
gpt4 key购买 nike

我的示例代码:

#include<iostream>
using namespace std;

class Parent{
public:
virtual void who()
{
cout<<"I am parent"<<endl;
}
};
class Child: public Parent
{
public:
void who()
{
cout<<"I am child"<<endl;
}
};

int main()
{
try{
try{
Child C;
Parent &P=C;
throw P;
}
catch(Parent &P)
{
P.who();
throw;//here it just propagates the Child exception
}
}
catch(Parent &P)
{
P.who();//parent who is getting executed
}

}

我正在阅读 Scott Meyers More Effective C++,第 12 项。因此,当我重新抛出它时,它应该会传播 Child 异常。但是外层的 catch P.who() 给了父级 who()。当我将外部 catch 更改为 Child 类型(程序中未提及)时,它终止了该过程。我的理解哪里错了?

Scott Meyers 所说的(经过我的编辑)

class Widget{...};
class Special Widget: public Widget { ... };
void passAndThrowWidget()
{
SpecialWidget localSpecialWidget;
...
Widget& rw = localSpecialWidget;
throw rw; //this throws an exception of type Widget!
}

................
................

catch(Widget &w) //catch Widget exceptions
{
...
throw; //rethrow the exception so it continues to propagate.
}
.............
.............

如果最初抛出的异常是 Special Widget 类型,则 catch block 将传播一个 Special Widget 异常,即使 w的静态类型是Widget。这是因为当异常被重新抛出时没有复制。

最佳答案

throw rw; //this throws an exception of type Widget!

这不会抛出 SpecialWidget。它只会抛出一个 Widget

throw; 从不改变抛出对象的类型。如果原始对象是一个 Child,那么在 throw; 之后它仍然是一个 child 。

关于c++ - 为什么重新抛出的异常没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638838/

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