当前课程知识点:基于Linux的C++ >  第十一讲 泛型编程 >  11.3 异常处理机制(一) >  LinuxCPP1103

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP1103在线视频

LinuxCPP1103

下一节:LinuxCPP1104

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP1103课程教案、知识点、字幕

我们首先来补充异常处理机制的内容

这个知识点其实相当重要

它涵盖了下面的几个主题

一个是异常处理机制的基本概念

第二个就是异常的引发

第三个就是异常的捕获

第四个就是异常类与异常对象

第五个是异常处理策略

最后一个是我们的异常描述规范

我们首先来看异常处理机制

它的基本概念

首先我们要搞清楚什么是异常

异常是什么呢 异常就是程序中可以检测的运行不正常的情况

异常是什么呢 异常就是程序中可以检测的运行不正常的情况

它不正常 那就叫异常

你比如讲 被零除

数组下标越界存储空间不足

你想分配一个内存但结果存储空间不足

这个就叫异常情况

它不太正常嘛 对吧

所以就要处理这个问题

一个健壮的程序这些问题都必须被处理

早期我们是怎么写程序呢

我们可以写一个 if 判断它

当它出错的时候我们就做特定的处理

我们还可以写什么呢

我们还可以使用断言来处理这个问题

到了 C++ 里边

为了和面向对象类库的架构相兼容

它提供了异常处理机制

允许你定义异常类

给了你一个更灵活的处理异常的技术手段

异常处理的最基本的流程

首先 某段程序代码在程序的执行期间

发生了一个特殊的情况

也就是一个异常的情况

那么它就会引发这样的异常

第二 另一段程序代码就会捕获这个异常 并且处理它

第二 另一段程序代码就会捕获这个异常 并且处理它

这个是异常处理机制的最基本的流程

我们来看一个例子 这个例子是栈

我们定义了一个类 JuStack

栈这个概念 我们前面解释过

它是一种很特殊的数据结构

它的元素满足先进后出规则

我们定义的这个栈类里边

有一个私有的指向整数的指针 _stk

有三个整数成员 _cap、_cnt、_top

前面都有下滑线

它记录了我们栈保存的全部的数据

和这个栈的相应的管理信息

_cap 表示这个栈的容量

_cnt 表达的是这个栈当前的元素个数

_top 表示我们的栈顶指针

位于第几个元素下标处

_stk 就是指向那个数组的 0 号元的指针

我们构造这个栈的时候

要 new 一段存储空间出来

然后让 _stk 指向那个存储空间

一开始容量是传进来的

而栈的元素个数和栈顶指针都是 0 号元

我们提供了两个最重要的函数

一个是 Pop() 一个是 Push()

一个是把元素从栈中弹出来

一个是把元素压到栈里面去

剩下几个都是一些 Get/Set 函数

或者是判断函数

像 IsEmpty() 判断栈是不是空的

IsFull() 判断栈是不是满的

这个栈类实现是很简单的

我们看它的具体代码

但实际上它是有问题的

首先当你调用成员函数 Stack::Pop()

想弹出一个数据的时候

栈是空的 你怎么办

第二个 如果你调用成员函数 Stack::Push()

想把一个元素压栈的时候

如果栈是满的 你怎么办

这是这个栈类在实现的时候

必须处理的两个问题

那么在异常处理机制下

我们就可以为它设计这样的解决方案

定义一个异常类

然后修改它对应的成员函数

在出现异常情况的时候引发这个异常

并且在需要的位置处理这个异常

这是异常处理机制下

我们实现这个栈类的关键

所以我们可以把刚才那段代码做一些修正

首先我定义两个类:EStackEmpty、EStackFull

这是两个异常类

一个表示栈是满的异常

一个表示栈是空的异常

这两个类都是空类

里面什么东西都没写

没关系 我们要的就是这个类的名字

定义好这两个空类就够了

我们修正 Stack::Pop() 这个函数

当栈是空的时候

我们会 throw EStackEmpty()

throw 就是 C++ 为我们提供新的关键字

表示引发一个异常

当栈是空的时候

我们就会引发一个异常

EStackEmpty() 就表示

我要构造 EStackEmpty 这个类的一个匿名对象

我要构造 EStackEmpty 这个类的一个匿名对象

然后把那个佚名对象抛出来

这就叫引发这个异常

类似地 Stack::Push()

当我把一个元素压栈的时候

如果这个栈是满的

我们就会抛出一个 EStackFull 异常

这是 Push() 和 Pop() 这两个函数实现时候所做的修改

这是 Push() 和 Pop() 这两个函数实现时候所做的修改

在这个修改里边 我们就使用到了异常处理机制

在这个修改里边 我们就使用到了异常处理机制

我们看主程序 我们主函数main()

定义 JuStack 类的一个对象 stack

标准容量是 17 个元素

我们尝试着向里面压栈

把一些数据朝里面压栈

注意我的异常处理的机制

我使用 try ... catch 这样的结构来处理有可能导致异常的程序代码

我使用 try ... catch 这样的结构来处理有可能导致异常的程序代码

也就是说 我们将有可能导致栈异常的代码封装在 try 这个块里

也就是说 我们将有可能导致栈异常的代码封装在 try 这个块里

try 的花括号对里

for 循环 stack.Push()

做的就是这个事

因为 Push() 这个函数有可能导致异常

所以我就把它封装在 try 这个花括号对里

catch 就来捕获这个异常

当它发生一个异常的时候

我们 catch 这条子句就会捕获这个异常

然后去做对应的处理

看到我这里面的代码

std::cerr 就向标准错误流里边输出一个提示信息

std::cerr 就向标准错误流里边输出一个提示信息

这就是 try ... catch

我们的异常处理机制的最基本的方案

catch 就负责捕获那个异常

因为 Push() 在将元素压栈的时候

是有可能导致一个栈满异常的

所以我们的 catch 子句将捕获 EStackFull 这个类的一个异常对象

所以我们的 catch 子句将捕获 EStackFull 这个类的一个异常对象

当然我们捕获的是对这个常对象的一个引用

当然我们捕获的是对这个常对象的一个引用

后面没跟着它的参数 不需要写

因为我们不关心它那个参数具体是什么

内容是什么 我们现在不关心

所以不需要写 可以

这个就是异常的捕获

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP1103笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。