当前课程知识点:C++语言程序设计进阶 > 第十二章 异常处理 > 标准程序库异常处理 > 标准程序库异常处理
exception:标准程序库异常类的公共基类
logic_error表示可以在程序中被预先检测到的异常
如果小心地编写程序,这类异常能够避免
runtime_error表示难以被预先检测的异常
编写一个计算三角形面积的函数,函数的参数为三角形三边边长a、b、c,可以用Heron公式计算:
//12_3.cpp #include <iostream> #include <cmath> #include <stdexcept> using namespace std; //给出三角形三边长,计算三角形面积 double area(double a, double b, double c) throw (invalid_argument) { //判断三角形边长是否为正 if (a <= 0 || b <= 0 || c <= 0) throw invalid_argument("the side length should be positive"); //判断三边长是否满足三角不等式 if (a + b <= c || b + c <= a || c + a <= b) throw invalid_argument("the side length should fit the triangle inequation"); //由Heron公式计算三角形面积 double s = (a + b + c) / 2; return sqrt(s * (s - a) * (s - b) * (s - c)); } int main() { double a, b, c; //三角形三边长 cout << "Please input the side lengths of a triangle: "; cin >> a >> b >> c; try { double s = area(a, b, c); //尝试计算三角形面积 cout << "Area: " << s << endl; } catch (exception &e) { cout << "Error: " << e.what() << endl; } return 0; } • 运行结果1: Please input the side lengths of a triangle: 3 4 5 Area: 6 • 运行结果2: Please input the side lengths of a triangle: 0 5 5 Error: the side length should be positive • 运行结果2: Please input the side lengths of a triangle: 1 2 4 Error: the side length should fit the triangle inequation
大家好
欢迎继续学习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这个函数
就能够返回那个字符串
因此我们就可以将这个字符串
输出给用户看
让它知道异常它的原因是什么
我们看运行时候的情况
如果我们输入的数据是合法的
就计算出正确结果来
如果输出的数据是不合法的
那么因为抛出异常
终止的程序的执行
就没有正确计算出结果
但是我们会看到
这个地方
通过
我们异常对象里面这个字符串
将异常的原因展示给用户了
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义