C++Primer:Break、Continue、Goto、Try/异常处理
2016-05-26 16:00
141 查看
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 对象。
相关文章推荐
- 利用C++制作dll并调用dll
- C++范围解析运算符::的使用
- C++面试笔记--const、sizeof
- C语言指针杂记
- Qt/C++ QSlider解决点击不能到该位置问题
- c++二叉树
- iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
- iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements
- c++中构造函数初始化的方法以及主要区别
- iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite
- C++标准模板库
- 如何打印出方法名和行号,并有条件地禁止的NSLog?
- C++实践参考:数组类模板
- C和C++编译器的函数名修饰规则
- C++实践参考:两个成员的类模板
- C++实践参考:排序函数模板
- C++面试笔记--宏定义
- C++ extern static
- 当析构函数遇到多线程 ── C++中线程安全的对象回调
- C++ string 用法详解