进阶之路

首页 新随笔 管理

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——

View Code
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初始化的构造函数。

1exception头文件:定义了最常见的标准异常类,其类名为exception

   只通知异常的产生,但不会提供更多的信息

2stdexcept头文件定义了以下几种常见异常类

   类型                   说明

exception            最常见的问题

runtime_error      运行时错误:仅在运行时才能检测到的问题

range_error         运行时错误:生成的结果超出了有意义的值域范围

overflow_error     运行时错误:计算上溢

underflow_error   运行时错误:计算下溢

logic_error           逻辑错误:可在运行前检测到的问题

domain_error        逻辑错误:参数的结果值不存在

invalid_argument   逻辑错误:不合适的参数

length_error         逻辑错误:试图生成一个超出该类型最大长度的对象

out_of_range       逻辑错误:使用一个超出有效范围的值

3new头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常

4type_info头文件定义了bad_cast异常类型(要使用type_info必须包含typeinfo头文件)

posted on 2013-05-10 18:18  进阶之路  阅读(139)  评论(0编辑  收藏  举报