5.4.3 范围for
这种语句可以遍历容器或者其他序列的所有元素
for( declaration : expression) statement
这种循环与传统的for循环有等价关系:
vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; for( auto &r : v) r *= 2; //等价于 for( auto beg = v.begin(); beg != v.end(); ++beg) (*beg) *= 2;
5.6 try语句块和异常处理
没有异常处理的话,发生异常后,会转到名为terminate的标准库函数,依据系统,一般会导致程序非正常退出。
throw表达式
使用throw表达式引发一个异常。
//<stdexcept>中定义了runtime_error异常 throw runtime_error("a exception occored");
try语句块
try { //可能出错的语句 } catch(runtime_error err) { //对异常进行处理 } catch(other_error o_err) { //对上一个没有捕捉到的异常进行处理 }
标准异常
<exception>:定义了最通用的异常类,仅报告异常发生,不提供额外信息。
<stdexcept>:定义类常用的异常类
exception:最常见的问题
runtime_error:只有在运行时才能检测到的问题
range_error:运行时错误,生成的结果超出了有意义的值域
overflow_error:运行时错误,计算上溢
underflow_error:运行时错误,计算下溢
logic_error:程序逻辑错误
domain_error:逻辑错误,参数对应的结果值不存在
invalid_argument:逻辑错误,无效参数
length_error:逻辑错误,试图创建一个超出改类型最大长度的对象
out_of_range:逻辑错误,使用了超出有效范围的值
<new>:定义了bad_alloc异常类型
<type_info>:定义了bad_cast异常类型
我们只能默认初始化exception、bad_alloc、bad_cast异常对象,其他异常对象需要以string或者C风格字符串初始化。
异常类型定义了一个what成员函数,返回一个const char*字符串。