C 中异常处理的语法try catch throw - 大漠一抹云樊书林- 博客园C++中异常处理的语法。
关键字1、try2、catch3、throw其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catch与try遥相呼应,定义当tryblock(受监控的程序块)出现异常时,错误处理的程序模块,并且每个catchblock都带一个参数(类似于函数定义时的数那样),这个参数的数据类型用于异常对象的数据类型进行匹配;而throw 则是检测到一个异常错误发生后向外抛出一个异常事件,通知对应的catch程序块执行对应的错误处理。
语法1、还是给一个例子吧!如下:int main(){cout << "In main." << endl;//定义一个try block,它是用一对花括号{}所括起来的块作用域的代码块try{cout << "在try block 中, 准备抛出一个异常." << endl;//这里抛出一个异常(其中异常对象的数据类型是int,值为1)//由于在try block中的代码是受到监控保护的,所以抛出异常后,程序的//控制流便转到随后的catch block中throw 1;cout << "在try block 中, 由于前面抛出了一个异常,因此这里的代码是不会得以执行到的" << endl;}//这里必须相对应地,至少定义一个catch block,同样它也是用花括号括起来的catch( int& value ){cout << "在catch block 中, 处理异常错误。
异常对象value的值为:"<< value << endl;}cout << "Back in main. Execution resumes here." << endl;return 0;}2、语法很简单吧!的确如此。
另外一个try block可以有多个对应的catch block,可为什么要多个catchblock呢?这是因为每个catch block匹配一种类型的异常错误对象的处理,多个catchblock呢就可以针对不同的异常错误类型分别处理。
毕竟异常错误也是分级别的呀!有致命的、有一般的、有警告的,甚至还有的只是事件通知。
例子如下:int main(){{cout << "在try block 中, 准备抛出一个int 数据类型的异常." << endl;throw 1;cout << "在try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;}catch( int& value ){cout << "在catch block 中, int数据类型处理异常错误。
”<< endl;}catch( double& d_value ){cout << "在catch block 中, double数据类型处理异常错误。
”<< endl;}return 0;}3、一个函数中可以有多个trycatch结构块,例子如int main(){try{cout << "在try block 中, 准备抛出一个int 数据类型的异常." << endl;throw 1;}catch( int& value ){cout << "在catch block 中, int数据类型处理异常错误。
”<< endl;}//这里是二个trycatch结构块,当然也可以有第三、第四个,甚至更多try{cout << "在try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;catch( double& d_value ){cout << "在catch block 中, double数据类型处理异常错误。
”<< endl;}return 0;}4、上面提到一个try block可以有多个对应的catch block,这样便于不同的异常错误分类处理,其实这只是异常错误分类处理的方法之一(暂且把它叫做横向展开的吧!)。
另外还有一种就是纵向的,也即是分层的、trycatch块是可以嵌套的,当在低层的trycatch结构块中不能匹配到相同类型的catchblock时,它就会到上层的trycatch块中去寻找匹配到正确的catch block异常处理模块。
例程如下:int main(){try{//这里是嵌套的trycatch结构块try{cout << "在try block 中, 准备抛出一个int 数据类型的异常." << endl;throw 1;}catch( int& value ){cout << "在catch block 中, int数据类型处理异常错误。
”<< endl;}cout << "在try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;}catch( double& d_value ){cout << "在catch block 中, double数据类型处理异常错误。
”<< endl;}return 0;}5、讲到是trycatch块是可以嵌套分层的,并且通过异常对象的数据类型来进行匹配,以找到正确的catch block异常错误处理代码。
这里就不得不详细叙述一下通过异常对象的数据类型来进行匹配找到正确的catch block的过程。
(1)首先在抛出异常的trycatch块中查找catch block,按顺序先是与第一个catchblock块匹配,如果抛出的异常对象的数据类型与catch block中传入的异常对象的临时变量(就是catch语句后面参数)的数据类型完全相同,或是它的子类型对象,则匹配成功,进入到catchblock中执行;否则到二步;(2)如果有二个或更多的catch block,则继续查找匹配第二个、第三个,乃至最后一个catch block,如匹配成功,则进入到对应的catch block中执行;否则到三步;(3)返回到上一级的trycatch块中,按规则继续查找对应的catch block。
如果找到,进入到对应的catch block中执行;否则到四步;(4)再到上上级的trycatch块中,如此不断递归,直到匹配到顶级的trycatch块中的最后一个catch block,如果找到,进入到对应的catch block中执行;否则程序将会执行terminate()退出。
另外分层嵌套的trycatch块是可以跨越函数作用域的,例程如下:void Func() throw(){//这里实际上也是嵌套在里层的trycatch结构块try{cout << "在try block 中, 准备抛出一个int数据类型的异常." << endl;//由于这个trycatch块中不能找到匹配的catch block,所以//它会继续查找到调用这个函数的上层函数的trycatch块。
throw 1;}catch( float& value ){cout << "在catch block 中, int数据类型处理异常错误。
”<< endl;}}int main(){try{Func();cout << "在try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;}catch( double& d_value ){cout << "在catch block 中, double数据类型处理异常错误。
”<< endl;}catch( int& value ){//这个例子中,Func()函数中抛出的异常会在此被处理cout << "在catch block 中, int数据类型处理异常错误。
”<< endl;}return 0;}6、刚才提到,嵌套的trycatch块是可以跨越函数作用域的,其实这里面还有另外一层涵义,就是抛出异常对象的函数中并不一定必须存在trycatch块,它可以是调用这个函数的上层函数中存在trycatch块,这样这个函数的代码也同样是受保护、受监控的代码;当然即便是上层调用函数不存在trycatch块,也只是不能找到处理这类异常对象错误处理的catch block而已,例程如下:void Func() throw(){//这里实际上也是嵌套在里层的trycatch结构块//由于这个函数中是没有trycatch块的,所以它会查找到调用这个函数的上//层函数的trycatch块中。