switch:只能在最后一个 case 标号(无default)或 defaul 标号后定义变量:此规则是为了避免出现跳过变量的定义和初始化的情况。 如果需要为某个特殊的 case 语句定义变量,可引入块语句。
异常机制:try 块和异常处理
throw 表达式, try 块和 catch 子句(也称为处理代码),标准库定义的异常类。
Sales_item item1,item2; while(cin>>item1>>item2) { try { if(!item1.same_isbn(item2)) throw runtime_error("1.Data must refer to the same ISBN:");// 字符串初始化 runtime_error cout<<item1+item2<<endl; } catch (runtime_error a) // 对象 a { cout<<a.what() //返回 C 风格字符串(unsigned char* 类型值) <<"\nTry Again? Enter y or n"<<endl; char c; cin>>c; if(cin && c=='n') break; }
如果不存在处理该异常的 catch 子句,程序运行跳转到 terminate 的标准库函数,该函数在 exception 头文件中定义。然后通过调用 abort 来终止程序运行。
通常系统出现异常,系统自动调用 terminate 来终止程序执行。
1.使用 NDEBUG 预处理变量(其实任意变量都可以)实现有条件的调试代码:
int main()
{
#ifndef NDEBUG
cerr<<"start maining"<<endl;
#endif
//...
}
开发完成后,定义 NDEBUG 预处理变量,(有效地)删除这些调试语句。
2.预处理器定义四种在调试时非常有用的常量:
——FILE—— ——LINE——
——DATE——
——TIME——
1 string word; 2 cin>>word; 3 if(word.size()<5); 4 cerr<<"Error: "<<__FILE__ 5 <<" line: "<<__LINE__ 6 <<"\nCompiled on "<<__DATE__ 7 <<" at "<<__TIME__<<endl 8 <<" Word read was \""<<word 9 <<"\" Length too short "<<endl;
3.使用NDEBUG 预处理变量 及 assert 预处理宏。优秀参考:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
string word; cin>>word; assert(word.size()<5); cerr<<"Error: "<<__FILE__ <<" line: "<<__LINE__ <<"\nCompiled on "<<__DATE__ <<" at "<<__TIME__<<endl <<" Word read was \""<<word <<"\" Length too short "<<endl;
最后在 #include<cassert> 之前加上 #define NDEBUG 来定义 NDEBUG,则 assert 语句不做任何工作,没有任何运行时代价,也不会引起任何运行时检查。当然,仅用于检查确实不可能发生的事情。
标准异常:
标准异常
标准库异常类定义在以下四个头文件中
exception、bad_alloc、bad_cast 类型只有默认构造函数。其他只有一个使用 string初始化的构造函数。
1、exception头文件:定义了最常见的标准异常类,其类名为exception。
只通知异常的产生,但不会提供更多的信息
2、stdexcept头文件定义了以下几种常见异常类
类型 说明
exception 最常见的问题
runtime_error 运行时错误:仅在运行时才能检测到的问题
range_error 运行时错误:生成的结果超出了有意义的值域范围
overflow_error 运行时错误:计算上溢
underflow_error 运行时错误:计算下溢
logic_error 逻辑错误:可在运行前检测到的问题
domain_error 逻辑错误:参数的结果值不存在
invalid_argument 逻辑错误:不合适的参数
length_error 逻辑错误:试图生成一个超出该类型最大长度的对象
out_of_range 逻辑错误:使用一个超出有效范围的值
3、new头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常
4、type_info头文件定义了bad_cast异常类型(要使用type_info必须包含typeinfo头文件)