(C/C++) 从错误到异常 (error->exception)

news/2024/2/28 1:55:01

文章目录

  • 前言
  • 衍变
    • error neutrality
    • exception neutrality
    • exception safety
  • 总结与思考
  • END

前言

在现代主流面向对象的编程语言中,异常是一个非常重要的机制。而历史悠久的C语言却没有这种机制。

大多数人都知道异常怎么使用,但是没思考过为什么会产生这种机制。

本文将从C语言时代的错误到C++时代的异常进行简单介绍和分析。

参考资料:“异常”是啥?何时用?如何用?很多人不懂,其实就一句话。学会这个,受用终身!

其实本文就是一个笔记

衍变

error neutrality

错误中立

允许该函数的子函数,运行中产生错误。

示例场景

读取一个指定文本的信息。

分析

在错误时,控制台会打印错误信息。

为了不让错误的状态继续运行,需要不断判断函数的返回值。

原因:

宏:errno 展开成一个每个线程独立的静态变量,或函数。运行的操作会把错误原因写入这个宏。

#include <error.h>
#include <stdio.h>
#include <stdlib.h>char *read_file(const char *path) {FILE *fp = fopen(path, "r");if (!fp) {perror("open fail\n");return NULL;}size_t cap = 1023;// +1 ('\0')的预留位置char *str = malloc(cap + 1);if (!str) {fclose(fp);perror("malloc fail\n");return NULL;}cap = fread(str, sizeof(*str), cap, fp);// 读取0个,且是流错误if (!cap && ferror(fp)) {free(str);fclose(fp);perror("fread ferror fail\n");return NULL;}str[cap] = '\0';fclose(fp);return str;
}int main(void) {char *str = read_file("h1ello.txt");if (!str) {perror("read fail\n");return EXIT_FAILURE;}printf("data:\n--------\n%s", str);free(str);return EXIT_SUCCESS;
}

exception neutrality

异常中立

允许该函数调用的子函数,以任何手段抛出异常。即异常透明。

示例场景

读取一个指定文本的信息。

分析

有了异常,消除了各种分支判断。

但是不处理具体异常所造成的异常状态,只是暴露在造成异常的地方和抛向调用方。

#include <cstdio>
#include <fstream>
#include <memory>::std::unique_ptr<char[]> read_file(const char* path) {::std::ifstream ifs;// 设置异常状态为位ifs.exceptions(::std::ios::failbit);ifs.open(path);::size_t cap = 1023;::std::unique_ptr<char[]> str(new char[cap + 1]);ifs.get(str.get(), cap + 1, 0);return str;
}int main(void) {try {auto str = read_file("hello.txt");::std::printf("data:\n--------\n%s", str.get());return EXIT_SUCCESS;} catch (const std::exception& e) {::std::printf("error: %s\n", e.what());return EXIT_FAILURE;}
}

exception safety

异常安全

示例场景

给一组存储对象添加数据。

分析

将力度更小的操作组合。

通过 copy and swap 的操作保证强异常安全。

虽然一定程度上开销较大,但是代码简洁又安全。

三个级别

  1. no-throw guarantee (不会抛出异常)
  2. basic exception safety guarantee (没有资源泄露)
  3. strong exception safety guarantee (强异常安全)
#include <map>
#include <memory>struct User {uint64_t uid;std::string name;int age;
};std::map<uint64_t, std::shared_ptr<User>> users_by_uid;
std::multimap<std::string, std::shared_ptr<User>> users_by_name;
std::multimap<int, std::shared_ptr<User>> users_by_age;// 事务机制。要么全部更新,要么什么都不更新 (保证外部调用的原子性)
// (强异常安全) copy and swap
void add_user(...) {auto user = std::make_shared<User>();// copyauto tmp_by_uid = users_by_uid;auto tmp_by_name = users_by_name;auto tmp_by_age = users_by_age;// operator may exception// basic exception safety guaranteetmp_by_uid.insert({user->uid, user});tmp_by_name.insert({user->name, user});tmp_by_age.insert({user->age, user});// swap (no-throw guarantee)tmp_by_uid.swap(users_by_uid);tmp_by_name.swap(users_by_name);tmp_by_age.swap(users_by_age);
}

总结与思考

异常的出现,让代码简洁又安全。

编程时候应该保持错误/异常中立的思想。

使用异常,能够抛向调用方,让调用方去处理这种异常错误。这也是异常这种机制产生的原因之一。

我们什么时候需要处理异常?只有当异常出现的地方,能够处理异常,才去处理异常。

比如:

vector 内存扩容失败了,那就原地处理,防止内存泄露。

一个网站的请求超时了,操作的具体子函数本身无法处理,就抛出异常,让上级调用者判断处理。




END


http://www.ppmy.cn/news/178530.html

相关文章

戴尔电脑最新bios设置图解介绍

1、开机F2进入bios设置界面&#xff0c;找到Secure boot目录下面的Secure boot enable&#xff0c;然后在右边的Disable上选择&#xff0c;然后到下面选择Apply应用就可以了&#xff0c; 如下图所示&#xff1a; 2、进入General目录&#xff0c;然后在下面找到Boot Sequence选…

魔客仕高清HDMI摄像头USB工业相机

1 魔客仕USB3.0摄像头1600万高清工业相机直播摄像机产品检测4K分辨率电脑条码扫描网络教学 8-50MM长焦变焦 魔客仕USB3.0摄像头1600万高清工业相机直播摄像机产品检测4K分辨率电脑条码扫描网络教学 8-50MM长焦变焦【图片 价格 品牌 报价】-京东 2 魔客仕高清HDMI摄像头USB工业…

眨眼摄像头可控制眼睛的涂鸦智能摄像机家用高清WIFI涂鸦摄像头

产品型号&#xff1a;YT10Tuya 1080P涂鸦智能网络摄像机 TuyaSmart Camera 产品名称&#xff1a;小红帽智能网络摄像机/眨眼小蓝摄像机/带眼睛开关控制的智能涂鸦摄像机 产品特色&#xff1a;隐私软硬保护双重结合&#xff0c;强大的加密保护外加上物理眼睑功能&#xff0c;让您…

鸿蒙一号指纹锁,新品|亚太天能智能猫眼款指纹锁A7f,正式出道啦!喵~

随着互联网大潮来袭&#xff0c;消费者正进入移动智能化的时代。“移动看家”的需求也随之在消费者的呼声中日益渐大&#xff0c;成为当下家居安全的热门追求。 基于对市场的精准洞察&#xff0c;结合了手机生态与智能猫眼的产品陆续进入家居的赛道&#xff0c;让人时刻掌握家门…

【Python金融-001】如何快速计算股票的收益?1行代码,高效做T

大家好&#xff0c;这里是程序员晚枫。 如果中年妇女的归宿是广场舞&#xff0c;那么中年男人的归宿想必就是股票了&#xff0c;懂得都懂。 在买卖股票时&#xff0c;一个重要的操作技巧就是做T&#xff0c;然而每次做T时计算价差、手续费&#xff0c;着实头疼。 今天给大家…

Delphi USB摄像头

RAD Studio 10.2.3 测试√ 目录 声明&#xff1a;1.展示设备2.展示格式3.打开预览4.保存图片至本地5.色彩选择 和 通道选项附件&#xff1a;untUSBCamera单元文件 声明&#xff1a; usesDirectShow9, untUSBCamera, Winapi.ActiveXprivate{ Private declarations }// 系统开发…

家用摄像头怎么选:实用性,功能性以及性价比是关键

很多用户打开电商平台&#xff0c;零零散散或者整版整版的摄像头&#xff0c;功能也是五花八门&#xff0c;让人眼花缭乱。想要在莫大的市场当中选择一款好的家用摄像头&#xff0c;对于从来没有接触过安防监控方面知识的人群来说&#xff0c;难于登天。比如一些商家说到的专业…

Intel深度摄像头RealSense D435(实感双目摄像头)和目标检测结合使用

文章目录&#xff1a; 1 RealSense D435摄像头介绍1.1 D435外观及内部构造 1.2 D435的参数规格1.3 D435应用 2 RealSense D435摄像头的使用2.1 使用D435读取摄像头RGB和深度图 3 使用D435做目标检测和距离测量 1 RealSense D435摄像头介绍 英特尔 实感™ D435 在我们推出的所有…

基于51单片机智能指纹锁设计

资料编号&#xff1a;181 功能讲解&#xff1a; 本设计师以51单片机作为核心微控制器通过单片机串口通信发送指令控制指纹识别模块进行存贮指纹比对指纹的作业。具体工作原理如下 1.指纹登陆的过程 指纹登陆时通过51单片机发出指令&#xff0c;通过光学传感器对每一枚指纹录…

驱动一款淘宝购买的130万像素的USB双目摄像头-记录

文章目录 巴拉巴拉一下1. 参数2. 使用3. 效果4. 需要注意的5. 其他参考 巴拉巴拉一下 前几天购买了一个USB双目相机如下&#xff0c;然后研究了一下怎么使用&#xff0c;简要记录一下自己的使用过程&#xff1b;相机的链接如下&#xff1a;https://item.taobao.com/item.htm?s…

200万低照度微光全彩夜视USB摄像头模组参数

支持SDK二次开发&#xff1b;200万像素&#xff1b;32*38板&#xff1b;低照度微光全彩夜视

除 Intel Realsense Dxxx 外 各市面深度摄像头对比(小觅智能 D1000-IR-120/Color、INDEMIND、领晰(LEADSENSE))(212)

因为我们使用的Intel Realsense D435摄像头在使用的过程中频繁出现掉线USB问题&#xff08;具体原因暂未查明&#xff0c;可能跟我们电脑配置软件配置有关&#xff09;&#xff0c;我们决定采购新的深度摄像头用作测试。 首先我们现在使用的Intel Realsense D435型号摄像头的相…

猫眼产品分析

一、前言 本文试图通过对猫眼电影的版本迭代历程分析、用户分析、功能分析、运营分析以及数据表现来回答以下几个问题&#xff1a; &#xff08;1&#xff09;猫眼电影的产品定位&#xff1f; &#xff08;2&#xff09;猫眼电影产品设计及运营中有哪些亮点和策略&#xff1f…

警猫眼App:闲置安卓旧手机DIY变成安防监控云端摄像头

现如今智能手机更新换代太频繁&#xff0c;换下来的旧手机卖二手不值钱&#xff0c;丢弃又觉得可惜&#xff0c;而且产生电子垃圾污染环境。怎么办&#xff1f;&#xff1f;&#xff1f;在这里要推荐一个变废为宝的好办法&#xff0c;就是通过安装一个免费的“警猫眼”的App&am…

★摄像头相关

1.LVDS传输 低电压差分信号&#xff08;LVDS&#xff09;&#xff0c;支持8&#xff0c;16&#xff0c;18&#xff0c;32bit&#xff1b;支持速率155Mbps&#xff08;77MHZ&#xff09;以上&#xff0c;最高655Mbps&#xff0c;理论1.923Gbps 由1组差分时钟和若干组差分信号…

什么叫侧面指纹识别_面指纹识别最新资讯

在苹果公司的硬件产品中&#xff0c;除了iPhone之外&#xff0c;人气最高的要数iPad产品。在今年由于网课等原因&#xff0c;导致苹果的iPad产品也变得十分热销&#xff0c;因此不少用户都在期待苹果推出新款的iPad更新旧的机型。 日前荣耀发布了面向中端市场所打造的 5G 手机—…

docker容器内部配置VNC和novnc,主机或者外部可访问

最近项目刚好要用到&#xff0c;配置了一下&#xff0c;工具主要是三个&#xff1a; 1. tigervnc&#xff0c; 2. xfce4 3 . novnc 1. tigervnc apt安装既可以,作用提供vncserver的服务 apt install tigervnc-standalone-server tigervnc-common 2. xfce4提供桌面服务&#…

戴尔win10计算机打不开,戴尔Win10系统摄像头打不开怎么办?

从买来电脑的那天起&#xff0c;我还没有用过我笔记本电脑的摄像头(我笔记本是戴尔inspiron 5567 win10系统)&#xff0c;昨天晚上一个朋友要和我视频&#xff0c;我用QQ接受视频请求后&#xff0c;结果发现&#xff0c;视频弹窗上的摄像图标点击后自动显示禁止。很是让人摸不着…

家用智能视觉市场达331亿元,摄像头率先进入成熟期,谁在领跑

据艾瑞咨询发布的《2021年中国智能家居行业研究报告智能视觉篇》显示&#xff0c;2020年国内家用智能视觉产品市场规模达到了331亿元。而随着智能视觉技术在智能家居板块的逐步渗透&#xff0c;该数字预计到2025年可达到858亿元的规模。 在智能家居产品阵营中&#xff0c;智能视…

指纹锁—AS608指纹模块

目录 一、工程内容 二、AS608指纹模块使用 1.AS608 与 USB转TTL模块 的接线 2.上位机配置 3.AS608与STC12C60A通讯 三、驱动MG995&#xff08;180度舵机&#xff09; 1.MG995舵机数据手册 2.舵机驱动&#xff1a; 3.定时器定时100us 4.中断函数 一、工程内容 实…
最新文章