第5章 语句

for语句中的init-statement可以定义多个对象,但是其只能有一条声明语句,因此,所有变量的基础类型必须相同

范围for语句,即:

for (declaration: expression)
{
	statement;
}

其等价于如下传统for语句:

for (auto beg=v.begin(), end=v.end(); beg!=end; ++beg)
{
	auto &r = *beg;
	// statement
}

如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型

C++提供了4种跳转语句:break、continue、goto、return。

异常是指存在于运行时的反常行为,这些行为超出了函数的正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。处理反常行为可能是设计所有系统最难的一部分。
当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去,而且信号的发出方无须知道故障将在何处得到解决。一旦发出异常信号,检测出问题的部分也就完成了任务。
如果程序中含有可能引发异常的代码,那么通常也会有专门的代码处理问题。
在C++中,异常处理包括
(1)throw表达式
(2)try…catch语句块
(3)异常类
throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面通常紧跟一个分号,从而构成一条表达式语句。
try…catch语句块的形式为:

try
{
	program-statement
}
catch (exception-declaration)
{
	handler-statement
}
catch (exception-declaration)
{
	handler-statement
}
...

寻找处理代码的过程与函数调用链刚好相反。当异常被抛出时,首先搜索抛出该异常的函数。如果没有找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。
如果最终还是没有找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
对于那些没有任何try语句块定义的异常,也按照类似的方法处理:毕竟,没有try语句块也就意味着没有匹配的catch子句。如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。

那些在异常发生期间正确执行了“清理”工作的程序被称为异常安全(exception safe)的代码。然而经验表明,编写异常安全的代码非常困难。对于一些程序来说,当异常发生时只是简单地终止程序。

C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中
(1)exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。
(2)stdexcept头文件定义了几种常用的异常类,包括:
runtime_error:只有在运行时才能检测出的问题
range_error:生成结果超出了有意义的值域范围
overflow_error:计算上溢
undeflow_error:计算下溢
logic_error:程序逻辑错误
domain_error:参数对应的结果值不存在
invalid_argument:无效参数
length_error:试图创建一个超出该类型最大长度的对象
out_of_range:使用一个超出有效范围的值
(3)new头文件定义了bad_alloc异常类型
(4)type_info头文件定义了bac_cast异常类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值