内容简介:在这个关于异常处理的系列里,通过检查编译器与链接器错误,我们已经发现不少异常抛出的秘密,但目前为止我们还看到任何关于异常处理的东西。让我们总结一下学到的异常抛出:目前为止相当简单,但异常捕捉有点复杂,特别因为它要求某种程度的反射(即,程序分析自己源代码的能力)。让我们继续在旧代码上尝试,在我们代码添加一些catch语句,编译它并看发生了什么:
作者: nicolasbrailo
在这个关于异常处理的系列里,通过检查编译器与链接器错误,我们已经发现不少异常抛出的秘密,但目前为止我们还看到任何关于异常处理的东西。让我们总结一下学到的异常抛出:
- 一个throw语句将被编译器翻译为两个调用,__cxa_allocate_exception与__cxa_throw。
- __cxa_allocate_exception与__cxa_throw“活”在libstdc++中。
- __cxa_allocate_exception将为新异常分配内存。
- __cxa_throw将准备一大堆东西并把这个异常转发给_Unwind_,一组libstdc++里的函数,并执行真正的栈回滚(这个 ABI 定义了这些函数的接口)。
目前为止相当简单,但异常捕捉有点复杂,特别因为它要求某种程度的反射(即,程序分析自己源代码的能力)。让我们继续在旧代码上尝试,在我们代码添加一些catch语句,编译它并看发生了什么:
|
|
备注:你可以从我的 github repo 下载完整的源代码。
就像之前那样,我们的seppuku函数把C世界与C++世界链接起来,只是这次我们添加了另外一些函数调用来使得我们的栈更有趣,加上我们已经添加了一组try/catch块,因此我们可用分析libstdc++如何处理它们。
像以前那样,我们得到了一些关于缺失ABI函数的链接器错误:
|
|
同样这里我们看到了许多有趣的东西。对__cxa_begin_catch与__cxa_end_catch的调用可能是我们期望的东西:我们尚不了解它们,但我们可以假定它们等同于throw/__cxa_allocate/throw转换(记得我们的throw关键字被翻译为一对__cxa_allocate_exception与__cxa_throw函数,对吧?)。不过__gxx_personality_v0是新玩意,它是后面几章的中心。
Personality函数做什么用呢?在介绍这个系列时,我们谈论过它,但我们将进一步探究它,连同我们的两个新朋友,__cxa_begin_catch与__cxa_end_catch。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS 上的相机捕捉
- 为什么不建议在 for 循环里捕捉异常?
- 谷歌ARCore 1.6改善环境照明 抛光屏幕捕捉和记录
- MediaStream 实现带摄像头捕捉的表情包制作器
- HoneyBot:一款功能强大的网络流量捕捉与分析框架
- [译]C++异常的幕后19:在着陆垫里获取正确的捕捉
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript经典实例
Shelley Powers / 李强 / 中国电力出版社 / 2012-3 / 78.00元
《JavaScript经典实例》各节中的完整代码解决了常见的编程问题,并且给出了在任何浏览器中构建Web应用程序的技术。只需要将这些代码示例复制并粘贴到你自己的项目中就行了,可以快速完成工作,并且在此过程中学习JavaScript的很多知识。你还将学习如何利用ECMAScript5和HTML5中的最新功能,包括新的跨域挂件通信技术、HTML5的video和audio元素,以及绘制画布。《JavaS......一起来看看 《JavaScript经典实例》 这本书的介绍吧!