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<<"starting main"<<endl;
#endif
//...
}
开发完成后,定义 NDEBUG 预处理变量,(有效地)删除这些调试语句。
2.预处理器定义四种在调试时非常有用的常量:
_ _FILE_ _
_ _LINE_ _
_ _DATE_ _
_ _TIME_ _
string word;
cin>>word;
if(word.size()<5);
cerr<<"Error: "<<__FILE__
<<" line: "<<__LINE__
<<"\nCompiled on "<<__DATE__
<<" at "<<__TIME__<<endl
<<" Word read was \""<<word
<<"\" 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()<10);
cerr<<"Error: "<<__FILE__
<<" line: "<<__LINE__
<<"\nCompiled on "<<__DATE__
<<" at "<<__TIME__<<endl
<<" Word read was \""<<word
<<"\" Length too short "<<endl;
// 确保所有的单词长度都小于10
最后在 #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头文件)