【数据结构】 10_C++异常简介

  • C++ 内置了异常处理的语法元素 try...catch...

    • try 语句处理正常代码逻辑
    • catch 语句处理异常代码逻辑
    • try 语句中的异常由对应的 catch 语句处理
try
{
    double r = divide(1, 0);
}
catch (...)
{
    cout << "Divided by zero ..." << endl;
}

  • C++ 通过 throw 语句抛出异常
double divide(double a, double b)
{
    const double delta = 0.00000000001;
    double ret = 0;

    if (!((-delta < b) && (b < delta)))
    {
        ret = a / b;
    }
    else
    {
        throw 0;    // 产生除 0 异常
    }

    return ret;
}

  • C++ 异常处理分析

    • throw 抛出的异常必须被 catch 处理

      • 当前函数能够处理异常,程序继续往下执行
      • 当前函数无法处理,则函数停止执行,并返回

未被处理的异常会沿着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

image.png


编程实验:C++异常处理初探

#include <iostream>

using namespace std;

double divide(double a, double b)
{
    const double delta = 0.00000000001;
    double ret = 0;

    if (!((-delta < b) && (b < delta)))
    {
        ret = a / b;
    }
    else
    {
        throw 0;    // 产生除 0 异常
    }

    return ret;
}

int main()
{
    cout << "main() begin" << endl;

    try
    {
       double r = divide(1, 0);

       cout << r << endl;
    }
    catch(...)
    {
        cout << "Divided by zero ..." << endl;
    }

    cout << "main() end" << endl;

    return 0;
}

输出:

main() begin
Divided by zero ...
main() end

  • 同一个 try 语句可以跟上多个 catch 语句

    • catch 语句可以定义具体处理的异常类型
    • 不同异常的类型由不同的 catch 语句负责处理
    • try 语句中可以抛出任何类型的异常
    • 任何异常只能被捕获(catch)一次
  • 异常处理的匹配规则

image.png

编程实验:异常类型匹配

#include <iostream>

using namespace std;

void Demo1()
{
    try
    {
       throw 'c';
    }
    catch (int i)
    {
        cout << "catch (int i)" << endl;
    }
    catch (double d)
    {
        cout << "catch (double d)" << endl;
    }
    catch (char c)
    {
        cout << "catch (char c)" << endl;
    }
}

void Demo2()
{
    throw "D.T.Software";
}

int main()
{
    cout << "main() begin" << endl;

    Demo1();

    try
    {
        Demo2();
    }
    catch (char *c)
    {
        cout << "catch (char *c)" << endl;
    }
    catch (const char *cc)
    {
        cout << "catch (const char *cc)" << endl;
    }
    catch (...)
    {
        cout << "catch (...)" << endl;
    }

    cout << "main() end" << endl;

    return 0;
}

小结

  • C++ 中直接支持异常处理的概念
  • try...catch... 是C++中异常处理的专用语句
  • try 语句处理正常代码逻辑,catch 语句处理异常情况
  • 同一个 try 语句可以跟上多个 catch 语句
  • 异常处理必须严格匹配,不进行任何的类型转换

以上内容整理于狄泰软件学院系列课程,请大家保护原创!

Image placeholder
junhong
未设置
  53人点赞

没有讨论,发表一下自己的看法吧

推荐文章
【数据结构】11_异常类构建

异常的类型可以是自定义类类型 对于类类型异常的匹配依旧是至上而下严格匹配 赋值兼容性原则在异常匹配中依然适用 一般而言 匹配子类异常的catch放在上部 匹配父类异常的catch放下下部 现代

【数据结构】2_数据的艺术

程序设计的挑战 利用计算机解决现实生活中的问题 生活中的不同个体之间存在联系 用计算机程序描述生活中个体间的联系 问题:如何描述生活中的个体?数据的概念程序的操作对象,用于描述客观事物数据的特点 可以

【数据结构】3_程序设计的灵魂

学员间的对话 木暮:我发现三井真是牛,只用一行就实现了strlen 宫城:那么强!他是怎么做的呢? 木暮:不知道,我看了一下,没看懂。。。 宫城:牛人就是牛人啊! 问题:程序是否越短越好?是否别人看不

【数据结构】1_进阶高手的大门

理解程序的本质问题:为什么会有各种各样的程序存在?程序的本质是什么?程序是为了解决实际问题而存在的,从本质而言,程序是解决问题的步骤描述。一小步的进阶:理解实际问题 确认问题类型 如:数值计算,求最

python set (集合)数据结构

set(集合)是一个非常有用的数据结构。它与列表(list)的行为类似,区别在于set不能包含重复的值。这在很多情况下非常有用。例如你可能想检查列表中是否包含重复的元素,你有两个选择,第一个需要使用f

Python入门教程_5. 数据结构

这个章节将更详细地描述一些你已经了解的内容,并且添加了一些新的内容。 5.1.深入列表对象 List数据类型包含更多的方法,下面是List对象包含的所有方法: list.append(*x*) 将一个

数据结构与算法分析——开篇以及复杂度分析

开篇 你也许已经发现了,工作了几年,原以为已经是一只老鸟。但看到刚参加工作的同事,你发现,原来自己一直在原地踏步。跟新人相比,你的唯一优势就是对业务更熟悉而已,别的就没有什么优势了。 怎样才能够让自己

数据结构与算法分析——开篇以及复杂度分析

开篇你也许已经发现了,工作了几年,原以为已经是一只老鸟。但看到刚参加工作的同事,你发现,原来自己一直在原地踏步。跟新人相比,你的唯一优势就是对业务更熟悉而已,别的就没有什么优势了。怎样才能够让自己更上

JavaScript 的数据结构和算法

现在有个还不是好的项目,未来会成为好的项目的项目想介绍给大家。传送门https://github.com/MasterShu/JavaScript-Da...这个是本人在维护的一个项目。主要是使用Ja

数据结构与算法分析——链表

链表链表是一种常见的数据结构,是一组有序的数据,每个链表中的数据项称为元素。它跟数组很像,二者对比学习会更容易理解和记忆。数组是内存中连续的一块,不会间断。链表在内存中不一定是连续的一块。如果内存只剩

数据结构与算法分析——队列

定义队列,和栈类似,也是一种操作受限的线性表数据结构。与栈结构不同的是,可以对队列2端操作,要求数据从一端进(入队),从另一端出(出队)。队列遵循"先进先出"的原则,即最先进队列的数据元素,同样要最先

数据结构与算法分析——栈

定义栈是一种操作受限的线性表,只支持在一端进行插入和删除操作(入栈和出栈)。后进先出、先进后出是它最大的特点。当某个数据集合只在一端插入和删除数据,并满足先进后出的特性时,就可以选择栈这种数据结构。实

java与数据结构

数组与链表数组 数组是数据结构中的基本模块之一 数组是一种基本的数据结构,用于按顺序存储元素的集合。但是元素可以随机存取,因为数组中的每个元素都可以通过数组索引来识别。 数组可以有一个或多个维度

redis数据结构(二) - 字符串

基于redis5.0的版本。字符串编码:字符串对象的编码可以是int,raw或者embstr。1.rawraw就是redisObject+sds,即redisObject的ptr指针指向一个sds对象

Redis的数据结构和内部编码

redis是单线程,一次只执行一条命令,那为什么可以这么快: 纯内存 非阻塞IO 避免线程切换和竞态消耗 在使用过程中要注意: 一次只运行一条命令 避免长(慢)命令,例如keys、flushall、f

第一章:数据结构绪论

[[数据结构-第1章]绪论目录 [1数据结构有什么用?] [2基本概念和术语] [3逻辑结构与存储结构] [3.1逻辑结构] [3.2存储结构] [4抽象数据类型] [4.1数据类型] [

Python入门教程_3. Python 简介

在下面的例子中,输入和输出分别由大于号和句号提示符(>>>和...)标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符

Go编程语言教程_1.0. Go编程语言(简介)

介绍 Go是一种过程编程语言。它由Google的RobertGriesemer,RobPike和KenThompson于2007年开发,但于2009年作为一种开放源代码编程语言发布。程序通过使用软件包

Git教程_3.1 Git 分支 - 分支简介

几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。

Go语言高级编程_5.1 Web 开发简介

5.1Web开发简介 因为Go的net/http包提供了基础的路由函数组合与丰富的功能函数。所以在社区里流行一种用Go编写API不需要框架的观点,在我们看来,如果你的项目的路由在个位数、URI固定且不

基于Tcp协议与基于Http协议的RPC简介笔记

前言:之前对于RPC方面的学习多限于对RMI原理的学习,直到今天在看陈康贤前辈的《大型分布式网站架构-设计与实践》这本书的时候,才发现原来RPC可以基于TCP协议也可以基于HTTP协议(这里所说的TC

JavaScript基础之 DOM简介

JavascriptDOM(文档对象模型)是一个允许开发人员操纵页面内容、结构和风格的接口。在本文中,我们将理解什么是DOM以及如何用Javascript去操作它。本文还可以作为基本DOM操作的参考。

Vue生命周期挂钩简介

在本文中,我们来学习可用于VueJS工作流程的所有hooks。VueVueJS是一个非常先进的JavaScript框架,由尤雨溪和Vue核心团队创建,超过230个开源社区爱好者贡献了代码。Vue的用户

容器管理工具 ctop 简介

如果你经常在linux下工作,那你肯定对top以及它的增强版htop非常熟悉。如果说top是管理进程的,而ctop则是管理容器的。安装在centos下安装ctop$wgethttps://github

简介PWA与Service Worker

1.关于PWAPWA,全称Progressivewebapps,即渐进式Web应用。PWA技术主要作用为构建跨平台的Web应用程序,并使其具有与原生应用程序相同的用户体验。早在2014年,W3C就已经