try/catch

try-catch的结构为:

try

被检查的语句}

catch(异常信息类型[变量名])

进行异常处理的语句}

说明:

(1)被检测的函数必须放在try块中,否则不起作用。

(2)try块和catch块作为—个整体出现,catch块是try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句。

(3)try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。

(4)一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。

(5)catch后面的圆括号中,一般只写异常信息的类型名,如catch(TYPE),catch只检查所捕获异常信息的类型: 异常信息可以是C++系统预定义的标准类型,也可以是用户自定义的类型(如结构体或类)。如果由throw抛出的信息属于该类型或其子类型,则catch与throw二者匹配,catch捕获该异常信息。另外:catch(double d),此时如果throw抛出的异常信息是double型的变量a,则catch在捕获异常信息a的同时,还使d获得a的值,或者说d得到a的一个拷贝。

(6)如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕捉任何类型的异常信息,如: catch(…)。

(7)try-catch结构可以与throw出现在同一个函数中,也可以不在同一函数中。当throw抛出异常信息后,首先在本函数中寻找与之匹配的catch,如果在本函数中无try-catch结构或找不到与之匹配的catch,就转到其上一层去处理,如果其上一层也无try-catch结构或找不到与之匹配的catch,则再转到更上一层的try-catch结构去处理,也就是说转到离开出现异常最近的try-catch结构去处理。(也就是异常处理的嵌套)。

(8)在进行异常处理后,程序并不会自动终止,继续执行catch子句后面的语句。

(9)在某些情况下,在throw语句中可以不包括表达式。

(10)如果throw抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数terminate,使程序终止运行。

(11)如果在try块(或try块中调用的函数)中定义了类对象,在建立该对象时要调用构造函数。在执行try块(包括在try块中调用其他函数)的过程中如果发生了异常,此时流程立即离开try块(如果是在try块调用的函数中发生异常,则流程首先离开该函数,回到调用它的try块处,然后流程再从try块中跳出转到catch处理块)。这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作,C++的异常处理机制会在throw抛出异常信息被catch捕获时,对有关的局部对象进行析构(调用类对象的析构函数),析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句。

亲测过的小程序:

NO1:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

double triangle(double,double,double);

double a,b,c;

cout<<"please input a,b,c:"<<endl;

cin>>a>>b>>c;

try //在try块中包含要检查的函数

{

while(a>0 && b>0 && c>0)

{

cout<<triangle(a,b,c)<<endl;

cin>>a>>b>>c;

}

}

catch(double) //用catch捕捉异常信息并作相应处理

{

cout<<"a="<<a<<",b="<<b<<",c="<<c<<",that is not traingle!"<<endl;

}

cout<<"end"<<endl;

 

return 0;

}

double triangle(double a,double b,double c) //计算三角形的面积的函数

{

//double sqrt;

double s=(a+b+c)/2;

if(a+b<=c||b+c<=a||c+a<=b) 

throw a; //当不符合三角形条什抛出异常信息

return sqrt(s*(s-a)*(s-b)*(s-c));

}

 NO2:

#include <iostream>

using namespace std;

int main()

{

void f1();

try

{

f1( );

//调用fl()

catch(double)

{

cout<<"OK0!"<<endl;

}

cout<<"end0"<<endl;

return 0;

}

void f1()

{

void f2();

try

{

f2();

//调用f2()

catch( char )

{

cout<<"OK1!";

}

cout<<"end1"<<endl;

}

void f2()

{

void f3();

try

{

f3();

//调用f3()

catch(int)

{

cout<<"Ok2!"<<endl;

}

cout<<"end2"<<endl;

}

void f3()

{

double a=0;

try

{

throw a;

//抛出double类型异常信息

catch(float)

{

cout<<"OK3!"<<endl;

}

cout<<"end3"<<endl;

}

运行结果:

OK0

end0。

 NO3:

#include <iostream>

#include <string>

using namespace std;

class Student

public:

Student(int n,string nam) //定义构造函数

cout<<"construtor-"<<n<<endl;

num=n;

name=nam;

}

~Student()                //定义析构函数

{

cout<<"destructor-"<<num<<endl;

void get_data(); //成员函数声明

private:

int num;

string name; 

};

void Student::get_data() //定义成员函数

if(num==0) 

throw num; //如num=O,抛出int型变量num

else 

cout<<num<<" "<<name<<endl; //若num不等O,输出num,name

cout<<"in get_data()"<<endl; //输出信息,表示目前在fet_data函数中

}

void fun() //过程函数(注意可见性)

Student stud1(1101,"tan");//建立对象studl

stud1.get_data(); //调用studl的getdata函数

Student stud2(0,"Li"); //建立对象stud2

stud2.get_data(); 

//调用smd2的get data函数

int main()

{

cout<<"main begin"<<endl; //表示主函数开始了

cout<<"call fun()"<<endl; //表示调用fun函数

try

{

fun();

//调用fun函数

catch(int n)

{

cout<<"num="<<n<<",error!"<<endl;

//表示num=0出错

cout<<"main end"<<endl; //表示主函数结束

return 0;

}

很有意思哟!

<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值