C++Primer:Break、Continue、Goto、Try/异常处理

来源:互联网 发布:ppt美化大师软件 编辑:程序博客网 时间:2024/06/11 04:12

1.break语句:

break语句用于结束最近的while、do while、for、switch语句,并将程序的执行权传递给紧接在被终止语句之后的语句。
<span style="font-size:18px;"># include <iostream>#include <vector>using std::vector;using std::cout;using std::endl;int main(){vector<int> vect;for(int i = 0;i<50; i++){vect.push_back(i);}for(vector<int>::iterator iter = vect.begin();iter != vect.end(); ++iter){cout<<*iter<<" ";}vector<int>::iterator iter1 = vect.begin ();while(iter1 != vect.end ()){if(*iter1 == 47 )break; // OK: Find it;else++iter1; // Not Find, Keep Looking}cout<<endl; //break to here...cout<<*iter1;return 0;}</span>

需要注意的是,break只能出现在循环或者switch结构中,或者出现在嵌套于循环或switch结构中的语句里。

2.continue语句:

continue 语句只能出现在 for、while 或者 do while 循环中,包括嵌套在这些循环内部的块语句中。

3.goto语句:

goto语句提供了函数内部的无条件跳转,从而实现goto语句跳转到同一函数内某个带标号的语句。(从上世纪60年代后期开始,不主张使用goto语句。goto语句使跟踪程序控制流程变得很困难,并且使程序难以理解,也很难修改)

4.Try块与异常处理:

在设计各种软件系统的过程中,处理程序中的错误和其他反常行为是困难的部分之一。像通信交换机和路由器这类长期运行的交互式系统必须将90%的程序代码用于实现错误检测和错误处理。随着基于Web的应用程序在运行时不确定性的增多,越来越多的程序员更加注重错误的处理。
异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。
异常机制提供程序中错误检测与错误处理部分之间的通信。C++的异常处理中包括:
1.throw表达式,错误检测部分使用这种表达式说明遇到了不可处理的错误。可以说,throw引发了异常条件。
2.try块,错误处理部分使用它来处理异常。try语句块以try关键字开头,并以一个或多个catch字句结束。在try块中执行的代码所抛出(throw)的异常,通常会被其中一个catch子句处理。由于他们“处理”异常,catch字句也称为处理代码。
3.由标准库定义的一组异常类,用来在 throw 和相应的 catch 之间传递有关的错误信息。

4.1 throw表达式

系统通过 throw 表达式抛出异常。throw 表达式由关键字 throw 以及尾随的表达式组成,通常以分号结束,这样它就成为了表达式语句。throw 表达式的类型决定了所抛出异常的类型。
举一个简单的例子:
S<span style="font-size:18px;">ales_item item1,item2;std::cin>>item1>>item2;if(item1.same_isbn(item2)){    std::cout<<item1+item2<<std::endl;     return 0;}else{      std::cerr<<"Data must refer to same ISBN"<<std::endl;      return -1; //indicate failure}</span>
在这个例子中,我们可以利用throw抛出异常来改写检测代码:
<span style="font-size:18px;">Sales_item item1,item2;std::cin>>item1>>item2;if(!item1.same_isbn(item2))      throw runtime_error("Data must refer to same ISBN");srd::out<<item1+item2<<std::endl;</span>
这段代码检查 ISBN 对象是否不相同。如果不同的话,停止程序的执行,并将控制转移给处理这种错误的处理代码。
throw 语句使用了一个表达式。在本例中,该表达式是 runtime_error 类型的对象。runtime_error 类型是标准库异常类中的一种,在 stdexcept 头文件中定义。我们通过传递 string对象来创建 runtime_error 对象,这样就可以提供更多关于所出现问题的相关信息。

4.2 Try 块

try块的通用语法形式为:
try{
      program-statements
}catch (exception-specifier){
      handler-statement
}catch (exception-specifier){
      handler-statement
}//......
try 块以关键字 try 开始,后面是用花括号起来的语句序列块。try 块后面是一个或多个 catch 子句。每个 catch 子句包括三部分:关键字 catch圆括号内单个类型或者单个对象的声明——称为异常说明符, 以及通常用花括号括起来的语句块。如果选择了一个 catch 子句来处理异常,则执行相关的块语句。一旦 catch 子句执行结束, 程序流程立即继续执行紧随着最后一个 catch 子句的语句。
try 语句内的 program-statements 形成程序的正常逻辑。这里面可以包含任意 C++ 语句,包括变量声明。与其他块语句一样,try 块引入局部作用域,在 try 块中声明的变量,包括 catch 子句声明的变量,不能在 try 外面引用。
     在前面的例子中,使用了 throw 来避免将两个表示不同书的 Sales_items对象相加。想象一下将 Sales_items 对象相加的那部分程序与负责与用户交流的那部分是分开的, 则与用户交互的部分也许会包含下面的用于处理所捕获异常的代码:
<span style="font-size:18px;">while (cin >> item1 >> item2) {try {      // execute code that will add the two Sales_items      // if the addition fails, the code throws a runtime_error exception} catch (runtime_error err) {    // remind the user that ISBN must match and prompt for another pair    cout << err.what()<< "\nTry Again? Enter y or n" << endl;    char c;    cin >> c;    if (cin && c == 'n')    break; // break out of the while loop}}</span>
关键字 try 后面是一个块语句。这个块语句调用处理 Sales_item 对象的程序部分。这部分也可能会抛出 runtime_error 类型的异常。上述 try 块提供单个 catch 子句,用来处理 runtime_error 类型的异常。在执行 try 块代码的过程中,如果在 try 块中的代码抛出 runtime_error 类型的异常, 则处理这类异常的动作在 catch 后面的块语句中定义。本例中, catch输出信息并且询问用户是否继续进行异常处理。如果用户输入'n',则结束while;否则继续循环,读入两个新的 Sales_items 对象

0 0
原创粉丝点击