C++ primer第十八章 18.1小结 异常处理

18.1 异常处理

  • 异常处理机制,允许程序独立开发的部分能够在运行的时候出现的问题进行通信并且做出相应的处理,异常的处理使得我们可以将问题的检测和处理分离开来。程序的一部分负责检测问题的出现,然后将解决这个问题的任务传递给程序的另一部分。负责检测的环节无法处理模块的所有细节,反之亦然。
  • 处理异常,最核心关键的问题:抛出异常时发生了什么、捕获异常时发生了什么、用来传递错误的对象的意义

18.1.1 抛出异常

  • C++通过抛出一个表达式来引发一个异常。被抛出的表达式的类型和当前的调用链决定了针对异常使用哪段代码来处理。在这个过程中会涉及调用链和抛出的异常最近匹配的过程
  • 当执行一个throw的时候,跟在throw后面的语句不会被执行。相反程序的控制权会从throw转移给与之相互对应的catch模块,这个catch模块可能是一个局部的catch,也可能是位于直接或者间接调用发生异常的函数的另外一个函数。
  • 控制权从一处转移到另外一处的含义:1,沿着调用链的函数可能提早退出;2,一旦程序开始执行异常处理代码,则沿着调用链的创建的对象将会被销毁。
  • throw的用法和return类似,他通常作为条件语句的一部分或者作为某个函数的最后(唯一)一条语句

栈展开

  • 抛出一个异常的时候,程序会暂停当前函数的执行过程,并且立刻寻找和异常相互匹配的catch语句。当throw出现在一个try语句块中,检查和该try块关联的catch语句。如果有匹配的catch,则使用该catch处理异常。如果没有匹配的catch,而且try嵌套在其他的try中,则继续检查和外层相互匹配的catch语句,如果还是没有catch语句,则退出当前的函数,在调用前函数的外层函数继续寻找
  • 上述的过程称为栈展开,栈展开的过程沿着嵌套函数的调用链不断查找,直到找到一个与异常相互匹配的catch语句为止,如果一直没有找到,则退出主函数终止查找过程。
  • 发生了异常,但是没有找到与之相互对应的catch时,程序将会调用terminate函数,终止程序的执行。

参考链接

猜你喜欢

转载自blog.csdn.net/CHYabc123456hh/article/details/109033947