当前课程知识点:C++语言程序设计进阶 > 第十二章 异常处理 > 导学 > 第12章导学
大家好
欢迎继续学习C++语言程序设计
这一章
我们和李超老师一起
为大家介绍异常处理
那么首先大家可能会有个疑问
什么是异常处理
为什么需要异常处理呢
现在我们考虑一下
我们在此之前写的程序
在此之前呢
我们的程序都是假设
用户的操作都是按照
我们要求的方式来进行的
环境都是很好的 没有问题的
在这种情况下
当然我们的程序
应该能够正常运行
可是有的时候
用户未必总是按照
我们指定的方式来使用软件
环境未必总是
一切如我们所愿
比如说
有可能我们在软件中
请用户输入一个文件名
然后我们来打开文件
这个时候
如果用户把文件名输错了
那么就找不到这个文件
就打不开
这个时候该怎么办呢
难道我们的程序就此崩溃
那肯定用户不喜欢这样的软件
是
所以这种情况下
C++有没有什么办法
有没有什么解决方案呢
郑老师说的这种情况
可能大家多多少少都这样想过
比如说我们的打印机出故障了
比如说磁盘这个时候不响应了
或者用户输入错误了
我们不希望程序这个时候
就终止掉
不能继续运行
我们希望程序能给大家
试错的机会
调整好环境以后 继续运行
如果做不到这一点
也至少需要给用户一个提示信息
告诉用户
这个时候出现了什么问题
或者我可能采取什么方法
可以把这个问题解决掉
这在C++里就被称作为容错性
那么C++里
究竟是通过什么样的机制
和手段
来保证这个容错性的呢
实际上在C++中
为了实现容错呢
当然你可以选择不同的方式
在任何高级语言中
都是这样的
大家可能会想到
比如说
我打开文件的时候
要是文件没找到
我判断一下
因为这个文件没有
那我告诉用户
你要打开的文件打不开
没有成功
那你能不能
再重新输入一个文件名
或者有的同学可能写程序选择
文件打不开了
那怎么办呢
我告诉用户 文件打不开
程序必须要终止了
然后就退出
不管你给用户一个什么反映
我刚才说的这样的方式呢
实际上就是就地处理错误
比如说文件打不开了
比如说用户操作错误了
那这个时候
我马上就地处理
给用户一个说法
然后也许继续运行
也许终止程序
但是我们考虑一下
有的时候我们如果说
处处都考虑一个操作成功与否
处处都顾及到
这个是不是有用户的误操作
是不是有环境的问题
那么程序的主逻辑就会受到干扰
写程序的时候
你就会感觉举步维艰
老判断成功与否 失败与否
老判断我还能不能进行下去
而且 李老师
还有些情况下
其实按照咱们写程序的经验
一些局部的小的模块
它是没有权限去处理这些错误的
比如说一个文件打不开
那么到底是应该给用户机会
输入下一个新的文件名呢
还是说这个程序应该就此终止
这个可能不是
去打开文件的这个模块
可以解决的问题
可能要由它的上级调用模块
才能决定这事应该怎么做
那么这种情况下呢
C++为我们提供了一种
很好的机制
叫做异常处理
所谓异常处理呢
就是将这些有可能发生的
用户操作的失误
环境的问题
都预先要设计好
将这些问题都作为
预先定义好有可能发生的故障
然后把它作为异常
写专门的模块去处理它
在程序运行过程中
运行到哪个地方
如果发生了这样的异常
当前的模块
可以选择不去处理
可以把它抛出
给它的调用者
那么具体说来
怎么做到这一点呢
也就是说
我们应该把
有可能发生异常的模块
都放在一个try块里面
也就是去尝试的一块代码
在这块代码去try
去尝试的时候
如果发生了异常
那么它就会暂停
当前这个局部代码的执行
控制流程会转到它之外
后面还有一个捕获异常的块
这个捕获异常的块
会把这个异常的信息给捕获到
捕获到以后可以决定
就地处理呢
或者是向它的调用者抛出
所谓抛出呢
实际上就相当于
咱们说的矛盾上交
矛盾上交了以后
要调用者决定
要不要处理它
它的调用者
其实还可以继续往上抛
直到某一个我们设计的模块
是专门负责处理这种异常的
能把这个异常处理掉
那么 李老师
这种机制看起来
是不是还蛮精致 蛮奇妙的
是的
它可以使我们在写代码的时候
专注于处理自己的主要逻辑
而把可能出现的一些错误呢
把它放到另外一个地方来处理
对
这样的话
我们的程序逻辑就比较简洁清晰
而且呢
也能够及时地
处理这些异常的情况
这一章
就由我给大家介绍
异常处理的基本概念
和基本语法
还有一些验证性的例题
由李超老师给大家介绍
这个综合实例
还有实验指导
在这一章的实验中呢
我们将构建一个自己的异常类
然后大家在测试程序中
来体验一下
如何去抛出一个异常
如何去捕获一个异常
如何去分开地处理异常
总综合实例中呢
我们会让
我们的银行帐户管理系统
具有更好的容错性
大家可以去尝试一下
听了我们的介绍
你是不是已经很有兴趣
跟我们一起
去探索异常处理的奥秘呢
那么接下来
就让我们一起开始学习
大家一定多多实践 多多动手
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义