大家好
欢迎继续学习C++语言程序设计
这一节我们来学习
C++标准库异常处理
在C++标准库中预先定义好了
很多与异常处理相关的类
我们可以直接使用这些异常类
也可以继承这些异常类
来形成我们自己
自定义的异常类
接下来我们就通过一个图
来观察一下
C++标准库中这些异常类
它们之间的继承关系
我们看到这个图中
列出了C++标准库中
标准异常类
它们之间的继承关系
我们看到exception
是所有异常类的基类
在它之下呢
又派生出不同的异常类
有一些类
在我们的例题中大家会见到
那么更多的呢
大家如果需要了解
可以去查阅C++的语法手册
这个表中
列出了标准库中
各种异常类它所代表的异常
这里异常的含义
它只是一个简要的说明
大家可以参考这个说明
尝试着去使用这个异常类
这里也列出了头文件
还是那句话
如果希望详细地了解呢
大家需要去参考
C++类库的说明
在C++库中有三个异常类
是其他标准异常类的基础
这三个类是excption logic_error
和runtime_error
exception
是所有异常类的公共基类
那么logic_error表示
可以在程序中
被预先检测到的异常
而且如果小心地编写程序
那么这类异常呢
应该能够避免
runtime_error表示
难以被预先检测到的异常
下面我们来看一个例题
计算三角形的面积
在这个例题中
要写一个函数
来计算三角形的面积
但是如果给出的三个边的边长
不符合构成一个三角形的要求
那么这个面积当然就计算不了
这种情况下呢
就会引发异常
这个时候我们来看
程序中是如何处理这个异常的
这是题目的要求
在题目中呢
给出了三角形面积的计算公式
我们来编程实现它
看看程序中发生异常 怎么办
这个程序通过函数area
来计算三角形的面积
它的参数就是
接收的是三角形的三个边的边长
当然首先它必须判断
给的三个边长是合法数据
才能进行这个面积的计算
如果这个边长不是都为正数
有得负数的
那么当然
就不是合法的三角形边长
就要抛出一个invalid_argument
这个异常对象
这个类型的异常呢
是标准异常类
它的括号里面的参数
是一个字符串
通常我们用这个字符串来表示
到底发生了什么
来说明这个异常
如果三角形的三个边长
它不符合
三角形的这种不等式要求
那这种情况下呢
也抛出一个invalid_argument异常
同样
在参数中用字符串
给出这一次的异常原因
只有当数据合法的时候
才来计算三角形面积
然后将计算结果正常返回
现在我们看主函数中
输入三角形的三个边长
然后就用这三个数据作为参数
去调用area
因为area这个函数
它是声明了有可能抛出
invalid_argument类型异常的
所以我们就要把它放在
这个try块里面
准备
如果它一旦发生了异常
抛出了异常
那么就有catch子句
去捕获这个异常
捕获异常的类型是什么呢
是exception类型
exception类型
是invalid_argument的复类
上它的上级的基类
所以呢
我们笼统地按照
这个最顶上的基类
exception类型去捕获
是能够捕获到这个异常的
当异常抛出的时候
这个area函数
就不会正确执行到结束的位置
就会在抛出异常的地方
终止执行
然后回到调用它的这个函数
也就是主函数中
那么如果
area没有能够正常返回的话
也就不会再执行这个赋值
也就不会再执行底下的输出
那么这个抛出的异常
就会立刻被catch子句捕获
然后在这儿我们调用
exception的what这个函数
就能够返回那个字符串
因此我们就可以将这个字符串
输出给用户看
让它知道异常它的原因是什么
我们看运行时候的情况
如果我们输入的数据是合法的
就计算出正确结果来
如果输出的数据是不合法的
那么因为抛出异常
终止的程序的执行
就没有正确计算出结果
但是我们会看到
这个地方
通过
我们异常对象里面这个字符串
将异常的原因展示给用户了