搜索
首页 教育/科学 职业教育 职业培训

C++的异常对象如何被传递?

C++++的异常对象如何被传递?

全部回答

2017-07-31

47 0

    “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++设计和编程方面的书籍。下面给出一个线程运行期间,它栈中所保存的数据的布局(部分片段),如下图:screen。
  width-550)this。style。width=screen。width-550;">总结 (1) 与函数的参数的传递类似, C++的异常对象的传递也分指针、传值和引用三种方式;。
    。

类似问题换一批

热点推荐

热度TOP

相关推荐
加载中...

热点搜索 换一换

教育/科学
职业培训
出国/留学
院校信息
人文学科
职业教育
升学入学
理工学科
外语学习
学习帮助
K12
职业教育
职业培训
远程教育
会计资格考试
司法考试
自考
公务员考试
职业培训
职业培训
举报
举报原因(必选):
取消确定举报