的执行。throw和return语句不同的是,在执行return语句将返回主调函数,继续执行函数调用语句的下一条语句,而执行throw语句将直接跳转到try子句后面catch子句,开始执行子句的异常捕获及处理操作;return语句时正常退出函数,throw语句则是异常退出。try-catch机制保证异常退出时能自动释放当前函数的形参,局部变量或对象。释放局部对象时会自动调用其析构函数。
??可以看出catch子句所定义的参数相当于函数形参,可以接收throw语句中异常表达式的结果。throw语句中的异常表达式相当于时调用函数的实参。
3、使用类描述异常
??throw语句所抛出的异常可以是基本数据类型、自定义或类类型。类类型可以提供更多的异常信息和异常处理能力。
#include<iostream>
using namespace std;
class Error
{
public:
int errCode; //异常代码
char errMsg[40]; //异常信息
Error(int code,char *msg) //构造函数
{ errCode = code;strcpy(errMsg,msg); }
void ShowError() //显示异常的详细信息
{ cout << errCode <<":"<<errMsg << endl; }
}
int Div(int n)
{
if(n<=0) //检查异常:如果n<0,则属于异常情况
{
Error err(-1,"输入的数据必须是正整数"); //定义异常类,并初始化
throw (err);
} //执行异常处理流程:抛出int型异常err,并退出当前函数执行
return(100/n);
}
int main()
{
int a;
cin >> a;
try //通过try保护代码段,接收异常
{
int result = Div(a);
cout << "100 / " << a << " = "<< result << endl;
}
catch(Error e) //捕获Error类的异常,也可以定义成异常类的引用:catch(Error &re)
{
e.ShowError(); //显示异常信息
catch(...) //捕获任意类型异常
{
cout<<"发生了其他异常"<<endl;
}
return 0;
}
4、try-catch异常处理机制的代码框架
try-catch异常处理机制的语法细节:
??1)语句try-catch可以多层嵌套。
??2)计算机执行throw语句,将跳转到包含该throw语句最下一层的catch子句进行异常类型匹配。
??3)语句try-catch可以直接包含throw语句。执行throw语句时的跳转目标实际上时查找最近的catch子句,也就是本函数的函数子句。
??4)子句catch在处理完异常后可以继续抛出异常。再次抛出异常的原因在于,某个异常需要经过不同层级代码多次处理,每个层级只完成整个异常处理环节的一部分。当捕获到的异常再次抛给上层的try-catch,此时throw语句可以不带异常表达式。
??关键字throw可以被用在函数定义或原型声明中,其作用是声明该函数可能抛出的异常列表。其语法形式为:函数类型 函数名(形参列表)throw(异常类型列表);
??示例:
????void fun() throw(A,B,C); //函数fun能却只能抛出A、B或C共三种类型的异常
????void fun() throw(); //函数fun不会抛出任何类型的异常
????void fun();????//函数fun可能会抛出任何类型的异常