[译]C++异常的幕后(1)

栏目: C++ · 发布时间: 5年前

内容简介:作者:每个人都知道良好的异常处理是困难的。在异常“生命期”的每个层面,出现这种情况的原因有许多:编写异常安全的代码是困难的,异常可能从不期望的位置抛出(双关语),理解设计不良的异常架构是复杂的,因为幕后发生了许多巫术,它是慢的;因为不正确地抛出异常可能导致调用不可原谅的std::terminate,它是危险的。虽然每个曾经与“异常”程序斗争的人可能知道这,造成这种混乱的原因并不广为人知。我们要问自己的第一个问题是,这一切是如何工作的。这是应该长系列的第一篇文章,在这个系列里我将讨论在C++里,异常在幕后是如

作者: nicolasbrailo

每个人都知道良好的异常处理是困难的。在异常“生命期”的每个层面,出现这种情况的原因有许多:编写异常安全的代码是困难的,异常可能从不期望的位置抛出(双关语),理解设计不良的异常架构是复杂的,因为幕后发生了许多巫术,它是慢的;因为不正确地抛出异常可能导致调用不可原谅的std::terminate,它是危险的。虽然每个曾经与“异常”程序斗争的人可能知道这,造成这种混乱的原因并不广为人知。

我们要问自己的第一个问题是,这一切是如何工作的。这是应该长系列的第一篇文章,在这个系列里我将讨论在C++里,异常在幕后是如何实现的(实际上在x86平台上使用gcc编译C++,不过这也可能适用于其他平台)。在这些文章中,将详细解释抛出与捕捉异常的过程,但对那些没有耐心的人这里有小的一个文章摘要:在gcc/x86中如何抛出异常:

  1. 当我们编写一条throw语句时,编译器把它翻译为对libstdc++的一对调用:分配异常,然后通过调用libstdc开始栈回滚过程。
  2. 对每条catch语句,编译器将在这个方法主体后写下一些特殊信息,一张这个方法可以捕捉的异常表以及清理表(稍后再解释清理表)。
  3. 随着回滚器穿过栈,它将调用libstdc++提供的一个特殊函数(称为personality例程),这个函数检查在栈里的每个函数可以捕捉哪些异常。
  4. 如果没有找到与这个异常相符的捕捉,调用std::terminate。
  5. 如果找到相符的捕捉,回滚器现在在栈顶开始启动。
  6. 随着回滚器第二次穿过栈,它将要求personality例程为这个方法执行清理。
  7. 这个personality例程将检查当前方法上的清理表。如果有任何清理活动要运行,它将“跳转”到当前栈帧并运行清理代码。这将为在当前作用域里分配的每个对象运行析构函数。
  8. 一旦回滚器到达可以处理这个异常的栈帧,它将跳转到合适的catch语句里。
  9. 在完成catch语句的执行时,将调用一个清理函数来释放该异常持有的内存。

这看起来已经相当复杂,而我们甚至还没开始;对异常处理的所有复杂性而言,这是一个短的、不准确的描述。

为了学习发生在幕后的所有细节,在下一篇文章我们将开始实现我们自己的迷你libstdlibc++。但不是全部,仅是处理异常的部分。实际上甚至还不是这些全部,仅是使得简单throw/catch语句工作所需的最低要求。将需要一些汇编,但不是很有趣。恐怕需要很多耐心。

如果你实在好奇且希望开始阅读有关异常处理的实现,那么你可以从这里开始,在后续几篇文章里我们将实现一个完整的规范。我将尝试使得这些文章更有指导性,更容易遵循,期望下次开始我们的ABI时再见!

免责声明:我一点也不精通抛出异常时的魔术。这个系列将试图揭开面纱,在过程中学习一些东西,同时我希望其中一些是正确的,毫无疑问有许多不太准确的细节。如果你认为我该改正什么,请告诉我。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机器学习实践指南

机器学习实践指南

麦好 / 机械工业出版社 / 2014-4-1 / 69.00

《机器学习实践指南:案例应用解析》是机器学习及数据分析领域不可多得的一本著作,也是为数不多的既有大量实践应用案例又包含算法理论剖析的著作,作者针对机器学习算法既抽象复杂又涉及多门数学学科的特点,力求理论联系实际,始终以算法应用为主线,由浅入深以全新的角度诠释机器学习。 全书分为准备篇、基础篇、统计分析实战篇和机器学习实战篇。准备篇介绍了机器学习的发展及应用前景以及常用科学计算平台,主要包括统......一起来看看 《机器学习实践指南》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试