【数据结构】 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_进阶高手的大门

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

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数据类型] [

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就已经

个人服务器架构简介

首先需要说一下服务器配置,只要你的服务器配置高于1核2G,均可使用该基础设施来管理你的个人服务器,你可以在服务中部署几个应用,并且把该服务器作为你的测试服务器来使用。但是你的应用过多,或者QPS稍大,

1万属性,100亿数据,每秒10万吞吐,架构如何设计?

有一类业务场景,没有固定的schema存储,却有着海量的数据行数,架构上如何来实现这类业务的存储与检索呢?58最核心的数据“帖子”的架构实现技术细节,今天和大家聊一聊。一、背景描述及业务介绍什么是58

NAS与对象存储:谁是非结构化数据存储的最佳选择?

非结构化数据是增长最快的数据类型之一。随着企业日积月累地生成、收集和存储越来越多的数据,必然会带来一个问题:什么是存储非结构化数据的最佳方式?直白来说,非结构化数据就是不遵循传统数据库格式的数据,其结

win10美化,让你的win10独一无二,与众不同!

1.原则美化之前,得先有一个目标对不对,笔者是一个喜欢简单的人,因此美化本着三大原则:简单,干净,整洁.呃....好像很抽象的样子,上图吧.反正没图没真相.怎么样,还可以吧,没有任何多余的东西.再来一

Spring Boot 中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们

复杂异常检测如何快速落地?看看百度怎么做

作者简介:周伟  百度云高级研发工程师负责百度云智能运维(Noah)告警通告系统的设计和研发,在大规模分布式系统、运维监控、精准报警等方面具有广泛的实践经验。干货概览本文提到的异常检测(Anomaly

重启大法失效?详述Oracle11g因JDBC bug引发异常Library Cache Lock等待处理事件

墨墨导读:在Oracle11g版本中可能出现由于JDBCbug导致sql绑定变量无法共享,过期游标过多的情况,此时如果发生大量并发业务,很有可能造成异常librarycachelock等待事件,造成数

异常记录——Connection reset

连接重置Connectionreset异常java.net.SocketException:Connectionreset详细信息java.net.SocketException:Connection

Java如何在没有throws签名的函数中手动抛出异常

如果想在方法中抛出异常,像下面这样直接throw是不行的。publicvoidtest(){ thrownewException(); }这时编译器会给我们一个错误:Error:(101,13)jav

YOLO目标检测从V1到V3结构详解

本文主要内容是对YOLO系列进行综述目标检测评价指标IoU(Intersection-over-Union)指标IoU简称交并比,顾名思义数学中交集与并集的比例。假设有两个集合A与B,IoU即等于A与

kernel的结构与命令行参数

kernel包结构在RHEL中rpm包是一种cpio格式的压缩文件,它由源文件和元数据(metadata)组成。而在rpm包中kernelrpm比较特殊,是一个只有元数据的包,在元数据中约束了以下的包

1000亿文本信息,高并发MD5查询,这么大数据量的业务怎么弄?

==提问== 沈老师,你好,想请教一个身份证信息检索的问题。公司有一个每秒5万并发查询的业务,(假设)根据身份证MD5查询身份证信息,目前有1000亿条数据,纯文本存储,前几天看你写LevelDB,请

10分钟搞懂:亿级用户的分布式数据存储解决方案!

来源:IT进阶思维原创,转载请注明原出处内容提供:李智慧,前阿里巴巴技术专家,《大型网站技术架构》作者6月6日晚,林志玲与Akira公布婚讯、徐蔡坤祝福高考同学超常发挥,粉丝们百万的转发和点赞造成微博