第六章:语句

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

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头文件)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值