C++ 使用const引用捕获异常 没有问题吗?如图所示,函数抛出临时对象应该是放在栈上的,捕获的时候使用的是const 引用,引用本质上就是指针,那么在使用引用的时候,对应的临时对象在栈上已经释放了呀?所以...
void MyFunc(int i)
{
try
{
func(i);
}
catch(int i)
{
switch(i)
{
case -1:
throw Exception(-1, "Invalid Parameter");
break;
case -2:
throw Exception(-2, "Runtime Exception");
break;
case -3:
throw Exception(-3, "Timeout Exception");
break;
}
}
}
int main(int argc, char *argv[])
{
try
{
MyFunc(11);
}
catch(const Exception& e)
{
cout << "Exception Info: " << endl;
cout << " ID: " << e.id() << endl;
cout << " Description: " << e.description() << endl;
}
catch(const Base& e)
{
cout << "catch(const Base& e)" << endl;
}
return 0;
}
throw 表达式初始化一个称为异常对象的特殊对象,由编译器管理并驻留在catch可访问的空间。
而&标号,只不过说可以直接操作这个对象而不是从新copy它。
详细可参考 C++ prime 第17章。
补充一下
throw的时候其实创建两个对象,一个本对象,一个根据本地对象拷贝构造的特殊对象
你的那个引用只不过指向了那个特殊对象。不用引用的话,也会再拷贝构造一个对象的。
确实不会抛异常,因为你的func(i)函数正常执行,所以后面的catch语句是不会执行的,再加上如果func(i)没有改变i的值,i的值则始终是MyFunc(11)的入参值11,所以MyFunc(11)函数也正常执行,不会抛异常,不会执行后面的catch语句