第5章 语句
switch语句
switch的case标签必须是整型常量表达式。
不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
假设运行以下代码时,case匹配了false:
case true:
string s; //非法;控制流试图绕过一个变量的初始化
int i = 0; //非法;控制流试图绕过一个变量的初始化
int j; //合法;该语句只是声明,没有初始化
break;
case false:
j = get_val(); //合法
//...
break;
因为蓝色和绿色的两组语句相当于在同一个block or scope。
为了避免这种情况,最好使用“{}”把变量定义在块内,确保后面的所有case标签都在变量的作用域外。
case true:
{
string s;
int i = 0;
int j;
break;
}
case false:
j = get_val(); //非法;j不在作用域内
//...
break;
异常处理
示例代码:

1 #include <iostream> 2 #include <stdexcept> 3 using namespace std; 4 5 int main() 6 { 7 int a,b; 8 9 while(cin>>a>>b) 10 { 11 try 12 { 13 if(b==0) 14 throw runtime_error("error: divide by zero."); 15 16 cout << a/b << endl; 17 } 18 catch(runtime_error err) 19 { 20 cerr << err.what() << endl; 21 cout << "input two integers again? y/n. "; 22 string op; 23 cin >> op; 24 if(op == "y") continue; 25 else break; 26 } 27 28 } 29 30 return 0; 31 }
throw表达式(throw expression):异常检测
try语句块(try block):异常处理;以关键字try开始,以一个或多个catch子句(catch clause)结束;catch子句也被称作异常处理代码(exception handler)
异常类(exception class):用于在throw表达式和catch子句之间传递异常的具体信息
抛出异常时将立即终止当前的函数,并把控制权转移给能处理该异常的代码。
类型runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。
runtime_error的对象必须初始化,方法是提供一个string对象或C风格的字符串。
"what"是runtime_error类的一个成员函数。此外,每个标准库异常类都定义了what成员函数;
what函数没有参数,返回值是C风格字符串(即const char*),这个字符串也就是在throw表达式中初始化runtime_error对象时提供的字符串(用于提供关于异常的一些文本信息)。
没有任何try语句块定义的异常,或者有try语句块但最终没有任何匹配的catch子句,程序将转到名为terminate的标准库函数。
指行terminate函数将使程序非正常终止。
标准异常
C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用。
exception头文件中:定义了最通用的异常类exception。它只报告异常的发生,而不提供额外信息。
stdexcept头文件中:
exception 最常见问题
runtime_error 只有在运行时才能检测出的问题
rang_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对象:只能默认初始化,不允许为这些对象提供初始值。(这些对象的what函数返回的内容由编译器决定)
对于其他异常类型:不允许默认初始化,必须使用string或C风格字符串初始化这些类型的对象。(这些对象的what函数返回的内容就是用于初始化它们的字符串)