C++的异常对象如何被传递
来源:互联网 发布:51talk英语怎么样知乎 编辑:程序博客网 时间:2024/05/10 04:45
转自http://se.csai.cn/category.asp?class=experteyes&page=3
在相遇篇的第4集文章中,曾经讲到过在C++的异常处理模型中,是用“对象”来描述程序中出现的异常,并且在那篇文章中详细讨论了这样做所带来的诸多好处,其中之一呢就是:对象一般都很好地实现了对象的构造、对象的销毁、对象的转存复制,这为异常处理模型中异常对象的转存复制和对象销毁提供了很好的支持。是的没错,但是所谓的异常对象到底是如何被复制和传递呢?从本篇文章开始,和接下来的几篇文章中,主人公阿愚将和大家一同比较深入地探讨这个问题,并力求弄清每一个重要的细节。
概述
呵呵!sorry,居然忘了阐述一下定义。那就是“C++的异常对象被传递”指的是什么?想当然大家也都知道,这指的就是异常出现时throw出的异常对象如何被传递到catch block块中,catch block中的异常处理模块再根据异常对象提供的异常信息做出相应的处理。程序员朋友们也许认为这很简单,其实说简单也好像不太简单,因为这种对象的传递或复制可能发生在同一个函数的不同程序块作用域间,也有可能是从当前的函数传递到上一个函数中,更有可能是把异常对象传递复制到上上(甚至更多层)的函数中。
异常对象的传递有点类似于函数调用过程中的参数传递的过程。瞧!catch关键字的语法不就跟函数的定义有点类似吗?作为入参的异常对象也是用括号被括起来的,只不过catch只能是拥有一个参数。另外连catch(…)语法也是抄袭函数定义的方式,表示接受任意类型的数据对象。
C++程序中函数的调用是通过“栈”来实现的,其中参数的传递也是保存到栈中,以实现两个函数间的数据共享。那么异常对象的传递呢?当然也是通过栈,其实这是很明显的一件事情,因为异常对象本身肯定是局部变量,因此它也肯定是被保存在栈中的。不过异常对象的传递毕竟还是与函数参数的传递有很大的不同,函数参数的传递是严谨的、一级一级的对象数据的压栈过程和出栈过程;但异常对象的传递却远比这要复杂些,因为它这是逆序的,属于局部变量的异常对象可能要往上层(或更上层)函数传递,它的过程是一个跳跃式的或比较混乱的过程。关于异常对象的传递具体是如何实现的,在爱的秘密篇中分析C++异常处理模型的实现时会再做详细阐述。而目前需要搞清楚的是,这个过程中所需要遵从的一些规律或标准。
函数的参数的传递一般有指针、传值和引用三种方式,同样,异常对象的传递也同样有这三种方式的区别。现在开始,主人公阿愚分别讲述每一种方式下异常对象是如何被传递的,不过在正式开始之前,还是先简要总结函数调用的过程,以及这过程栈的变化。因为这对随后的具体分析和理解也许大有帮助。
函数的调用过程与“栈”
C++程序员对这个过程肯定非常熟悉,因此这里不做细致的讲述,只做一个概要性的总结。
(1) 函数的调用过程实质上利用栈来实现的指令(eip)执行远程转移和返回的过程;它在CPU指令级别上就得到了支持(CALL和RET指令);
(2) 每个线程都有一个自己的栈,因此每个线程的函数调用执行是相互不受影响的;
(3) C和C++中的函数参数的入栈顺序一般是从右到左进行;
(4) C++中的函数的参数的传递一般有指针、传值和引用三种方式;
(5) C和C++中函数的返回值一般都是保存到EAX寄存器中返回的;
(6) C和C++中函数中寻址参数和局部变量,一般都是通过EBP寄存器加上偏移来进行的,如参数一般是:[EBP+XX],而局部变量则一般是:[EBP-XX];
(7) 在程序运行时,EBP中的值一般是指向当前的函数调用帧,而ESP一般指向栈顶。
如果对上面论述有不太清楚或不太熟悉的朋友,建议先看看专门讲述C++设计和编程方面的书籍。下面给出一个线程运行期间,它栈中所保存的数据的布局(部分片段),如下图:
总结
(1) 与函数的参数的传递类似, C++的异常对象的传递也分指针、传值和引用三种方式;
(2) 与函数的参数的传递不同的是,异常对象的传递是向上逆序的,而且是跳跃式的。
下一篇文章详细介绍C++的异常对象按传值的方式被复制和传递。朋友们,不要错过,请继续吧!
- C++的异常对象如何被传递
- C++异常对象的传递
- C++的异常对象按引用方式被传递
- C++的异常对象按传值的方式被复制和传递
- 异常对象的传递与复制构造函数
- C++异常对象三种方式传递的综合比较
- C++异常对象三种方式传递的综合比较
- 进程间传递Parcelable对象出现ClassNotFoundException异常的解决方法:
- Intent如何传递对象
- Intent如何传递对象
- Oracle 异常的传递
- C++异常对象传递的时候,使用普通对象还是指针还是引用(使用引用)
- 传值方式传递异常对象
- 详解如何动态调用WebService传递复杂对象的实现
- new创建对象的如何传递构造参数-c++
- c++ 如何高效传递对象,避免不必要的复制
- 如何向线程传递对象
- Activity间如何传递对象
- AbstractFormController执行流程
- C++ 对象的成员函数中抛出的异常
- rails 本地 连接 转自 javaeye
- 迅速构建最初级的VMM testbench
- 两个链接:java集合框架////java中hashcode()和equals()的详解
- C++的异常对象如何被传递
- C++中vector类型简介
- 随便说说
- Hello World~
- [Python-Twisted] 协议基类源码分析。
- 网站架构之变迁
- 折腾:一个小破ASP程序也能浪费不少时间
- ASP.NET表单验证之基本验证控件一
- 谈谈Java继承中的重载,覆盖和隐藏