异常就是程序在运行过程中,由于使用环境的变化及用户的操作而产生的错误。
例如,内存不足时,应用程序请求分配内存,程序中出现了以零位整数的错误;打印机未打开,导致程序运行中挂接这些设备失败等,否会引发异常。对这些错误,应用程序如果不能进行合适的处理,都会使程序变得非常脆弱,甚至不可使用。
对于这些可以预料的错误,在程序设计时,应编制相应的预防代码或处理代码,以便防止异常发生后造成严重后果
异常处理的基本思想是:在底层发生的问题,逐级上报,直到有能力可以处理异常的那级为止。或者说在应用程序中,如果某个函数发现了错误并引发异常,这个函数就将该异常向上级调用者传递,请求调用者捕获该异常并处理该错误。如果调用者不能处理该错误,就继续向上级调用者传递,直到异常被捕获错误被处理为止。
如果程序最终没有相应的代码处理该异常,那么该异常最后被c++系统所接受,c++系统就简单地终止程序运行。
C++异常处理的目的是在异常发生时,尽可能减少破坏,使得其不影响或尽量少的影响程序其他部分的运行。
总的来说,对于小型程序和大型程序出现异常时,其处理的思想和方法稍有区别,一般来说,当小型程序在出现异常时,则将程序立即中断运行,无条件释放所有资源。
exit()函数用于退出程序,该函数可加参数,其中exit0)表示正常退出程序,而exit1)表示异常退出程序。
C++中对异常处理的实现分为捕获异常和处理异常两个步骤。
C++中,提供了语句try/catch来捕获异常,其中trycatch分别用于定义异常和定义异常处理。
通常异常处理是放在try语句块后的由若干个catch语句组成的程序,其格式是:
Catch(异常类型声明1)
{
   异常处理语句块1
}
Catch(异常类型声明2)
{
   异常处理语句块2
}
.......................
Catch(异常类型声明n)
{
   异常处理语句块n
}
在使用catch语句定义对异常的处理时,其中的参数可以只为某个数据类型,如catchint)的形式,在具体的环境中其类型不同。
抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:
Throw 表达式;
如果try语句快的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常, 则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于c++使用数据类西给你来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。
一般来说,throw语句通常与trycatchtryfinally语句一起使用,可以使用trrow语句显式引发异常。
异常处理的执行过程是:
1、 控制通过正常的顺序执行到try语句,然后执行try语句块内的程序段。
2、 如果在try语句块执行期间没有发生异常,则catch语句块不被执行。
3、 如果在try块语句执行期间或在该语句快直接或间接调用的任何函数中发生了异常,并将异常抛弃,则该异常将沿调用链上传,直到找到与该异常类型相匹配的catch语句块来处理异常为止。异常处理后执行所有catch语句块的后续程序。
4、 如果未找到与该异常类型相匹配的catch语句块,则由c++终止程序的运行。
当在程序中找到一个匹配的catch异常处理后,如果catch()语句的异常类型声名是一个值参数,则其初始化方式是复制被抛弃的异常对象;如果catch()语句的异常类型声名是一个引用,则其初始化方式是使该引用指向异常对象。
如果目前没有异常被处理,那么执行一个没有操作数的throw语句后,编译系统将会调用terminate()函数结束进程。