栈解旋:当发生异常时,从进入try块后,到异常被抛掷前,这期间在栈上的构造的所有对象都会被自动析构。析构的顺序与构造的顺序相反,这一过程被称为栈的解旋(unwinding) (注意栈解旋发生的时间段~)
Q:简述一下“栈展开”的过程?
A:栈展开的就是指匹配catch子句的过程。
具体匹配过程如下:
1)当程序抛出一个异常或者在try块中检测到异常时就会停止执行当前的调用链,开始寻找与异常匹配的catch子句。
2)当在try块中出现一个throw语句或者在try块中调用了可能出现异常的函数时,首先检查与该try块匹配的catch语句(一个try可能对应多个catch),逐个检查,直到找到匹配的即停止寻找,进入该catch执行处理异常的程序。(注意,匹配不代表最佳匹配,所以最佳的匹配要放在catch的最前端)。
3)如果执行过程2)还是没有找到匹配的catch,且当前try嵌套在外部的try块中,则程序就会在外部的try块中查找,直到找到匹配的为止。
4)如果执行过程3)还是没有找到匹配的catch语句,则退出当前调用的函数,继续在退出为止的函数的其他函数中寻找,以此类推。
5)如果最终执行完上述步骤后还是没有找到匹配的catch,则就是说异常得不到处理(没有被捕获),程序会调用标准库函数terminate终止函数的执行。