1. 异常的概念
程序的错误通常包括:语法错误、逻辑错误、运行异常。
语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译、连接时由编译器指出。
逻辑错误是指程序能顺利运行,但是没有实现预期的功能,这类错误通过调试与测试发现。
运行异常(exception)是指程序在运行的过程中由于意外的结果,运行环境问题造成程序异常终止,如内存空间不足、打开文件不存在、文件读些不成功、执行了除0操作等。
导致程序运行异常虽然是无法避免,但是可以预料,为了保证程序的健壮性,必须要在程序中对运行异常进行预见性处理,对运行异常进行预见性处理称为异常处理。
处理异常的方法很多,其中最直接的办法是调用C++中的exit()或abort()函数终止程序的执行,exit() 与abort()函数原型在头文件Cstdlib中声明,两者的区别是exit()在中止程序运行前,会关闭被程序打开的文件、调用全局和static类型对象的析构函数等;而abort()什么都不做。使用exit()与abort()来处理异常显得很机械,有的异常需要进行更复杂的处理。
以往的异常捕获方式是利用if语句检查调用函数的返回值,或者在函数调用之前检查,如在求两个数的商时就需要在函数前检查除数是否为0来捕获、防止异常:
float quotient(int a, int b) { return a/(float)b; }
…
cin>>a>>b;
if (b==0) //捕获异常
cout<<"Divide 0 !"<<endl;
else
cout<<a<<"/"<<b<<"="<<quotient(a,b);
这种处理机制有如下缺点:
(1) 每使用quotient()一次, 就必须利用if语句检查一次,使得程序对正常执行过程的描述与对异常的处理交织在一起,程序的易读性不好。
(2) 若异常信息在函数中返回,会破坏程序的逻辑性。如:原来没有返回值的函数,要定义成返回值;对原来有返回值的函数无法定义异常信息返回;象构造函数、析构函数这类由程序自动调用,又没有返回值的特殊函数,就没有办法利用返回值返回异常。
为此,C++提供了异常处理解决方案。
程序的错误通常包括:语法错误、逻辑错误、运行异常。
语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译、连接时由编译器指出。
逻辑错误是指程序能顺利运行,但是没有实现预期的功能,这类错误通过调试与测试发现。
运行异常(exception)是指程序在运行的过程中由于意外的结果,运行环境问题造成程序异常终止,如内存空间不足、打开文件不存在、文件读些不成功、执行了除0操作等。
导致程序运行异常虽然是无法避免,但是可以预料,为了保证程序的健壮性,必须要在程序中对运行异常进行预见性处理,对运行异常进行预见性处理称为异常处理。
处理异常的方法很多,其中最直接的办法是调用C++中的exit()或abort()函数终止程序的执行,exit() 与abort()函数原型在头文件Cstdlib中声明,两者的区别是exit()在中止程序运行前,会关闭被程序打开的文件、调用全局和static类型对象的析构函数等;而abort()什么都不做。使用exit()与abort()来处理异常显得很机械,有的异常需要进行更复杂的处理。
以往的异常捕获方式是利用if语句检查调用函数的返回值,或者在函数调用之前检查,如在求两个数的商时就需要在函数前检查除数是否为0来捕获、防止异常:
float quotient(int a, int b) { return a/(float)b; }
…
cin>>a>>b;
if (b==0) //捕获异常
cout<<"Divide 0 !"<<endl;
else
cout<<a<<"/"<<b<<"="<<quotient(a,b);
这种处理机制有如下缺点:
(1) 每使用quotient()一次, 就必须利用if语句检查一次,使得程序对正常执行过程的描述与对异常的处理交织在一起,程序的易读性不好。
(2) 若异常信息在函数中返回,会破坏程序的逻辑性。如:原来没有返回值的函数,要定义成返回值;对原来有返回值的函数无法定义异常信息返回;象构造函数、析构函数这类由程序自动调用,又没有返回值的特殊函数,就没有办法利用返回值返回异常。
为此,C++提供了异常处理解决方案。