分页:
上一页 1 2 3 [4] 5 6 7 8 9 下一页
异常对象按传值复制
现在开始涉及到关键的地方,当catch block捕获到一个异常后,控制流准备转移到catch block之前,异常对象必须要通过一定的方式传递过来,假如是按传值传递(根据catch关键字后面定义的异常对象的数据类型),那么此时就会发生一次异常对象的拷贝构造过程。示例如下:
void main()
{
try
{
{
// 构造一个对象,当obj对象离开这个作用域时析构将会被执行
MyException ex_obj1("ex_obj1");
throw ex_obj1;
}
}
// 由于这里定义的是“按值传递”,所以这里会发生一次拷贝构造过程
catch(MyException e)
{
cout<<"捕获到一个MyException类型的异常,名称为:"<<e.GetName()<<endl;
}
}
程序运行的结果是:
构造一个MyException异常对象,名称为:ex_obj1
拷贝一个MyException异常对象,名称为:ex_obj1
拷贝一个MyException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
捕获到一个MyException类型的异常,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
通过结果可以看出确实又多发生了一次异常对象的拷贝复制过程,因此在catch block中进行错误处理时,我们可以放心存储异常对象,因为不管C++异常处理模型到底是采用什么方法,总之当前这个异常对象已经被复制到了当前catch block的作用域中。
异常对象什么时候被销毁
通过上面的那个程序运行结果还可以获知,每个被拷贝复制出来的异常对象都会得到被销毁的机会。而且销毁都是在catch block执行之后,包括那个被抛出的属于临时局部变量的异常对象也是在执行完catch block之后,这很神奇吧!不过暂时先不管它。先搞清catch block中的那个按值拷贝传入的异常对象到底确切的是在什么时候被析构。示例如下:
void main()
分页:
上一页 1 2 3 [4] 5 6 7 8 9 下一页