程序中try、throw、catch三者之间的关系

时间:2023-03-10 01:44:23
程序中try、throw、catch三者之间的关系

c++程序中,采用一种专门的结构化处理逻辑的异常处理机制。

1.try语句

try语句块的作用是启动异常处理机制,检测try语句块中程序语句执行时可能出现的异常。

try语句块总是与catch一同出现,在一个try语句块后,至少有一个catch语句块。

2.throw语句

throw语句用来强行抛出异常,具体格式如下:

throw[异常类型表达式]   异常类型表达式可以是类对象,常量或变量表达式。

3.catch语句块

catch语句块首先捕捉try语句块产生的或有throw抛出的异常,然后进行处理。

catch(形参类型[形参名])                        //形参类型可以是c++的基本类型(如int,long,char等)

{

          //异常处理语句...

}

catch语句块中使用该形参名。例如:

try

{

throw "除数不能为0!";

}

catch(const char* s)    //制定形参类型名

{

cout<<s<<endl;         //使用异常形参名

}

当catch语句块中的整个形参为“...”时,则表示catch语句块能够捕捉任何类型的异常。catch的语句块前面必须是try语句或者另外一个catch语句块。

try、throw、catch三者之间的关系和注意点

throw和catch的关系类似函数调用关系,catch指定形参,throw给出实参。编译器按照catch出现的顺序及catch指定的参数类型确定throw抛出的异常应该有哪个catch来处理。

throw不一定出现在try语句块中,实际上,他可以出现在需要的任何地方,即使在catch的语句块中,仍然可以继续使用throw,只要最终有catch可以捕获它即可。

案例:

class Overflow

{

public:

  Overflow(char,double,double);

};

void f(double x)

{

throw Overflow('+',x,3.45e107);  //在函数体中使用throw,用来抛出一个对象

}

try

{

  f(1.2);

}catch(Overflow& oo)

{

  //处理Overflow类型异常

}

当throw出现在catch语句块中时,通过throw即可重新抛出一个新类型的异常,也可以重新抛出当前这个异常,在这种情况下,throw不应带任何实参。

try{

}catch(int)

{

throw "hello exception";  //抛出一个新的异常,异常类型为const char*

}catch(float)

{

throw;  }    //重新抛出当前的float类型异常