异常处理针对的是运行错误:
程序运行时出现的错误称为异常,对异常的处理-------------异常处理。
异常处理指对运行时出现的差错以及其他例外情况的处理:没有异常处理程序时,运行出现异常,程序只能结束运行。
c++中的异常处理机制:
try
{
被检查语句;
throw异常;
}//这部分是异常引发
catch(异常类型1)
{进行异常处理的语句1}
catch(异常类型2)[变量名]
{进行异常处理的语句2}
//这部分是异常处理
对于上面的程序来说,throw通常是单独存在于一个函数定义中的,然后try在main中,并且try所在的块会调用throw所在的函数;
一般throw抛出的异常和catch所捕获的类型相匹配;
一旦throw抛出异常,那么就不会执行throw下面的语句,而是会转到相应的catch语句中。但是catch语句执行完之后依旧会向下执行知道程序结束。
特点:
异常引发和处理机制分离,而不在同一个函数中处理;
底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理!!(很像现实中,老板对你说:你想做什么放心去做吧,有什么事来找我!!)
c++中处理异常的过程:
在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了的问题,再传递给上一级,由上一级处理;
如此逐级上传,直到最高一级还无法处理的话,运行系统会调用abort终止程序。
异常处理方法:
被检测的函数必须放在try块中,否则不起作用;
try和catch必须成对出现,并且try和catch必须用{};
一个try-catch中只能有一个try,可以有多个catch;
catch中一般只写异常信息的类型名,除非特殊需要会加上变量名;
如果throw抛出的异常信息找不到与之匹配的catch块,那么系统会调用一个系统函数terminate,使程序终止运行!!
标准异常类 #include <stdexcept>:基类是exception
在异常处理中处理析构函数:
即使要通过异常处理模块退回到上一级的上一级函数的时候,位于中间级中的析构函数要执行的还是要执行,但是中间级模块中的剩余的程序就不能执行了。
由上面的机制可知,善后工作只能指望catch块以及析构函数。
在函数声明中也可以进行异常情况指定:(不是必须的,可以不指定)
为便于阅读程序,使用户在看程序的时候能够知道所用的函数是否会抛出异常以及异常信息可能的类型,c++允许在声明函数时列出可能抛出的异常类型:
double triangle(double,double,double)throw(int,double,float)函数可以抛出int double float类型的异常信息;
double triangle(double.double,double)throw()声明一个不能抛出异常的函数!!!
要指定异常类型,必须在声明和定义的时候都指定,并且类型相同。