C++Primer笔记——5.语句-创新互联

语句 try 语句块和异常处理

异常是指存在于运行时的反常行为,这些行为超出了函数的正常功能范围。

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、做网站、泗洪网络推广、重庆小程序开发、泗洪网络营销、泗洪企业策划、泗洪品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联为所有大学生创业者提供泗洪建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

当程序的某部分检测到一个在它无法处理的问题时,需要用到异常处理。

异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。

  • throw表达式(throw expression),异常检测部分使用 throw 表达式来表示它遇到了无法处理的问题。我们说 throw 引发了异常

  • try语句块(try block),异常处理部分使用 try 语句块处理异常。try语句块以 try 关键字开始,并以一个或多个catch子句处理。因为 catch 子句处理异常,所以它们也被称作异常处理代码

  • 一套异常类(exception class),用在 throw 表达式 和 相关的catch子句之间传递异常信息

一、throw 表达式

程序的异常检测部分使用 throw 表达式引发一个异常。

Sales_item item1, item2;

	cin >>item1 >>item2;

	//首先检查两条数据是否关于同一种书籍的
	if (item1.isbn() != item2.isbn()) {throw runtime_error("Data must refer to same ISBN");
	}

	//程序如果执行到这里表明两个isbn是相同的
	cout<< item1 + item2<< endl;

抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。类型runtime_error是标准库异常类型的一种,定义在 stdexcept头文件种。

二、try 语句块

跟在 try语句块之后的是一个或多个catch子句。当选中了某一个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到 try 语句块最后一个catch 子句之后的那条语句继续执行。

1. 编写处理代码

其中与用户交互的代码负责处理发生的异常,它的形式可能如下:

while (cin >>item1 >>item2) {try {	//执行两个 Sales_item 对象的代码
			//如果添加失败,代码抛出一个runtime_error 异常
		}
		catch (runtime_error err) {	//提醒用户两个 isbn 必须一致,询问是否重新输入
			cout<< err.what()<< "\nTry Again? Enter y or n"<< endl;
			char c;
			cin >>c;
			if (!cin || c == 'n') break;
		}
	}
2. 函数在寻找处理代码的过程中退出

寻找处理代码的过程与函数调用链刚好相反。当异常被抛出时,首先抛出该异常的函数。如果没有找到匹配的catch子句,终止该函数,并且在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层返回,直到找到适当类型的catch子句为止。

如果最终还是没能找到匹配的catch子句,程序转到名为 terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。

三、标准异常

C++ 标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用。

  • exception 头文件定义了最通用的异常类 exception。它只报告异常的发生,不提供任何额外的信息

  • stdexcept 头文件定义了几种常用的异常类

  • new 头文件定了 bad_alloc 异常类型

  • type_info 头文件定义了 bad_cast 异常类型

stdexcept 定义的异常类

exception最常见的问题
runtime_error只有在运行时才能检测出的问题
range_error运行错误:生成的结果超出了有意义的值域范围
overflow_error运行错误:计算上溢
underflow_error运行错误:计算下溢
logic_error程序逻辑错误
domain_error逻辑错误:参数对应结果值不存在
invalid_argument逻辑错误:无效参数
length_error逻辑错误:试图创建一个超出该类型大长度的对象
out_of_range逻辑错误:使用一个超出有效范围的值

我们只能以默认初始化的方式初始化exception,bad_alloc,和 bad_cast 对象,不允许为这些对象提供初始值。

异常类型只定义了一个名为 what 的成员函数,该函数没有参数,返回值是一个指向 C 风格字符串的 const char*。该字符串的目的是提供关于异常的一些基本信息。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:C++Primer笔记——5.语句-创新互联
网站网址:http://hbruida.cn/article/degjec.html