C++程序设计之异常处理
1、异常处理的概念和使用条件
程序运行中的某些错误(或意外情况)不可避免但可以预料。
例如,做除法或模运算时使用的除数为0。

2、异常处理的特点:
1)当引发异常时,要提供有意义的文本;
2)只在必要时才会引发异常;
3)当函数的参数不符合条件时,不引发异常;
4)不能为正常的错误或可预期的错误产生异常
3、异常处理的实现:
C++中提供的对异常进行处理的机制,那就是在程序中使用try、catch和throw。
通过throw抛掷异常后,
系统将跳转到与所抛掷的实参(表达式)类型完全匹配的catch块,执行完catch块后将不再返回,继而转到catch块序列的最后一个catch 块的下一语句处去执行。
4、try块
通过try可构成try块,用于标记运行时可能出现异常的程序代码。
异常来源:
try 块中直接抛掷的异常 l l通过所调用的“下层”函数而间接抛掷的各种异常
注意:抛掷异常是通过throw 语句来完成的。

5、catch块
通过catch可构成catch块,它紧跟在try块的后面
1、用于监视并捕获运行时可能出现的某一种类(类型)的异常,
2、对此种异常进行具体的处理(处理程序代码包含在catch块之中)。

6、可以只给出异常类型,这适合于异常处理中不使用形参的情况
允许捕获任何类型的异常,在catch 块首括号用省略号代替参数(即“...”)
以省略号为参数的catch 块应该在其他catch块之后,否则,其后的所有catch 块都将起不到任何作用。
7、throw 表达式
表达式:一个变量或对象、一个常量或字符串等
系统将根据表达式的值类型来与各catch块首括号中形参的异常类型进行“对比”,
若“匹配”成功(要求类型完全一致,系统并不自动进行类型转换),则跳转到那一catch块去执行,即进行相应的异常处理;
若所有匹配都不成功,则将自动去执行一个隐含的系统函数“abort()”来终止整个程序的运行。
8、允许抛掷异常的语句处于被调用函数中,而catch语句位于主调函数中。

9、允许在同一程序中使用多个try块,而且这些try块可以处于不同的位置并具有不同的层次级别。


10、注意:
异常被某一个层次的catch块所捕获,程序执行完catch块代码后,
将从其所在的块序列之后的下一语句处继续执行。
11、堆栈展开的原因:
执行完catch块后将不再返回到throw语句之后,继而转到catch块序列的最后一个catch块的“下一语句”处去执行。
throw的“跳转”实际上相当于跳出了所在作用域,所以系统将自动检查在那些作用域中已经构造但尚未析构的处于堆栈中的局部对象(与变量),并自动进行相应的退栈与析构处理。
12、堆栈展开的过程

13、异常的适用范围
在C++程序设计中有一些和异常处理的用法相关的设计事项
虽然对于异常处理的支持是被内置在语言中的,但并不是每个C++程序都应该使用异常处理。
因为抛出异常不像正常函数调用那样快,
所以异常处理应该用在独立开发的不同程序部分之间用于不正常情况的通信