C++Primer笔记——5.语句

语句

try 语句块和异常处理

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

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

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

  • 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*。该字符串的目的是提供关于异常的一些基本信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值