一、异常处理简介
C++中,异常处理一般用3个保留字实现:throw、try和catch。当被调用的函数检测到异常条件时,立即使用throw引发一个异常。在上一层调用函数中使用try检测函数调用是否引发了异常,被检测到的异常由catch捕获并处理。
二、try、catch语句
需要检测异常的程序段(如函数调用)须放在try语句中执行,称之为保护代码。异常由catch语句捕获并处理。形式为:
1 try 2 {...} 3 catch(<类型1><参数1>) 4 {...} 5 ... 6 ... 7 ... 8 catch(<类型n><参数n>) 9 {...} 10 catch(...) 11 {...}
一个try语句可与多个catch语句相联系。若某个catch语句的参数类型与引发异常的信息数据类型相匹配,则执行该catch语句的异常处理,此时由throw语句抛出的异常信息传递给catch语句中的参数。最后的catch(...)捕获所有类型的异常。其中的省略号可与任何数据类型匹配。
三、throw语句
引发异常的throw语句必须在try语句中,或由try语句直接(间接)调用的函数体执行。一般形式为:
throw exception;
exception为一个异常值,可以是任意类型的变量、对象或值。
四、异常处理的实现
①将可能发生异常的程序段放在try中;
②控制通过正常的顺序执行到达try语句,然后执行try中的保护代码;
③在保护代码执行过程中:
若没有引发异常,那跟在try后的catch不会执行。程序会在try后跟随的最后一个catch子句后面的语句继续执行下去。
若发生异常,则会通过throw创建一个异常对象并抛出。
使用多个catch语句时:
Ⅰ、catch按照在try语句后出现的顺序被检查;
Ⅱ、被匹配的catch子句将捕获并处理异常;
Ⅲ、若没有找到匹配的catch语句,则运行函数terminate将被自动调用(默认功能是调用abort终止程序)。
五、例子
1 //处理除数为0的异常 2 #include <iostream> 3 using namespace std; 4 int Div(int x,int y) 5 { 6 if (y==0) 7 { 8 throw y; 9 } 10 return x/y; 11 } 12 void main() 13 { 14 int a,b; 15 cout<<"请输入两个正整数:"<<endl; 16 cin>>a>>b; 17 try 18 { 19 int c=Div(a,b); 20 cout<<a<<"/"<<b<<"="<<c<<endl; 21 } 22 catch (int) 23 { 24 cout<<"除数为零。 "; 25 } 26 27 }
结果: