[英]Why doesn't the rethrown exception work as expected?
我的示例代码:
#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更有效的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
块会传播一个Special Widget
异常,即使w
的静态类型是Widget。 这是因为重新抛出异常时不会复制。
throw rw; //this throws an exception of type Widget!
这不会抛出SpecialWidget
。 它只会抛出一个Widget
。
throw;
永远不会改变抛出对象的类型。 如果原始对象是一个Child
,它将在throw;
后仍然是一个孩子throw;
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.