c++异常机制(1) -- 什么是异常机制

情况一:    

之前,我们提到了防御性编程,就是说我们预判一些可能出现的问题,然后进行相应的处理。 但是,这些处理往往是在函数中进行的。

比如,判断数组下标是否合法。 -》   if(下标 < 0){ 相应的处理 };

如上,这些异常在函数中进行处理。会使得函数中多出很多处理的代码,但是在使用异常处理机制之后在函数中遇到异常之后,我们可以将异常抛出,然后再使用到函数的地方再检测和处理异常这样函数中就是简单的功能实现了。 

情况二: 

就是如果在函数中遇到了错误,我们不进行处理,我们会给调用者返回一个错误符号(数字等),来表示操作异常。

比如,判断数组下标是否合法。 -》  if(下标 < 0){return -1}; 

如上,发生异常就返回给调用者一个错误符号(此处为-1),但是如果我们的函数调用有多层呢? 那么只能一层一层的向上级返回这个错误信号,直到最终的调用方使用了异常机制之后,我们就可以一步到位,直接返回到最上级的调用方。 

下面代码是在没有使用异常机制情况下,对相应的情况进行处理。 

代码: 将一个源文件中的内容拷贝到另外一个目标文件中去。 

#define BUFFER_SIZE 1024// 将一个文件中的内容拷贝到另外一个文件中去
int makeFile(const char* dest, const char* src) {// 定义文件指针FILE* fp1 = NULL, * fp2 = NULL;// 打开文件, 以只读二进制形式打开文件,打开失败返回NULLfp1 = fopen(src, "rb"); // 判断文件是否成功打开if (!fp1) {return -1;   //  返回错误标记,表示源文件打开失败}// 打开文件,以只写二进制形式打开文件,打开失败返回NULLfp2 = fopen(dest, "wb");// 判断文件是否成功打开if (!fp2) {return -2;    //  返回错误标记,表示目标文件打开失败}// 进行文件的拷贝char buffer[BUFFER_SIZE];     // 1024字节的缓存int readLen, writeLen; // 每次读取的长度和写入的长度// 读取的长度大于0,说明有内容可以写入,执行循环体的写入内容while ((readLen = fread(buffer, 1, BUFFER_SIZE, fp1)) > 0) {writeLen = fwrite(buffer, 1, readLen, fp2);// 如果一次写入的长度和读取的长度不等,那么说明写入失败if (readLen != writeLen) {return -3;    // 返回错误标记,写入失败}}// 关闭文件fclose(fp1);fclose(fp2);return 0;  // 一切正常返回0
}int makeFile2(const char* dest, const char* src) {int ret;ret = makeFile(dest, src);printf("makeFile2 函数被调用");return ret;
}int main(void) {int ret = 0;ret = makeFile2("dest.txt", "src.txt");// 根据不同的返回信号进行相应的处理if (ret < 0) {switch (ret) {case -1:printf("源文件打开失败\n");break;case -2:printf("目的文件打开失败\n");break;case -3:printf("文件信息写入打开失败\n");break;}}system("pause");return 0;
}

一. 

按照正常情况,代码会运行成功的,我们手动的将源文件src.txt删除掉,再去执行代码。会打印源文件打开失败。 

原因以只读形式打开文件,如果文件不存在就打开失败,fp1中为NULL返回-1,然后进行处理,打印信息。 

 二.

上面代码中,我们还写了一个中间函数makeFile2,目的是为了能够体现,上面说到的使用函数返回错误标志必须一级一级的跳转。 makeFile函数先将错误标记返回到makeFile2函数,然后makeFile2函数再将错误标记返回给main函数。

我们在makeFile2中return之前打印一句话,来观察返回错误信息时的过程。会发现错误信息只有通过makeFile2的return才能返回到main函数中

使用异常机制可以优化这个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496399.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中常用的热门库Pygame介绍

Pygame是一个跨平台的Python模块和库&#xff0c;用于创建视频游戏&#xff0c;如独立游戏和多媒体应用。它提供了一组用于制作游戏的常用功能&#xff0c;包括图形、声音、碰撞检测等。Pygame是基于SDL&#xff08;Simple DirectMedia Layer&#xff09;库的&#xff0c;SDL是…

2024年要大干一场!桌面备忘录哪个好?桌面记事本便签软件哪里下载?

当谈到桌面备忘录哪个好的时候&#xff0c;我们常常会陷入选择困难之中。在这个信息爆炸的时代&#xff0c;我们需要一个高效、便捷、易用的工具来帮助我们记录重要事项&#xff0c;提醒日程安排&#xff0c;让我们可以在2024年当中大干一场。而在众多桌面备忘录软件中&#xf…

折叠面板展开动画

<template><div><div class"p_open" click"handleOpen">{{showMore ? 收起筛选 : 展开筛选}}</div><el-collapse-transition><div class"item" v-show"showMore"><div>[Vue warn]: Error …

Asymmetric Directional Coupler(非对称型定向耦合器)

Asymmetric Directional Coupler 正文示例1------直波导耦合部分尺寸不一致示例2------直波导耦合部分材料有区别 正文 在 Directional coupler and Synchronous optical coupling&#xff08;定向耦合器和同步光耦合&#xff09; 和 Symmetric Directional Coupler and trans…

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…

Socket的学习——ipc

来&#xff0c;先给你看一张图。

GDB动态调试学习-2-【断点】

文章目录 在程序地址上打断点在程序入口处打断点获取程序入口地址 在命名空间设置断点命名空间给命名空间的函数下断电 在文件行号上打断点保存已经设置的断点设置临时断点设置条件断点command指令 忽略断点 在程序地址上打断点 当调试汇编程序&#xff0c;或者没有调试信息的…

Kafka安全模式之身份认证

一、简介 Kafka作为一个分布式的发布-订阅消息系统&#xff0c;在日常项目中被频繁使用&#xff0c;通常情况下无论是生产者还是消费者只要订阅Topic后&#xff0c;即可进行消息的发送和接收。而kafka在0.9.0.0版本后添加了身份认证和权限控制两种安全服务&#xff0c;本文主要…

transformer--编码器(掩码张量、注意力机制、多头注意力机制)

编码器部分: 由N个编码器层堆叠而成每个编码器层由两个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接。第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接 掩码张量 什么是掩码张量 掩代表遮掩&#xff0c;码…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台&#xff0c; 打通了HarmonyOS云侧与端侧能力&#xff0c;能够轻松实现HMS Core、AGC Serverless能力调用。其中&#xff0c;数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时&#xff0c;可以使用…

(案例贴1)html+js+css todolist便签条

版本1&#xff1a;静态壁纸背景 版本二&#xff1a;动态小球跳动背景 f86084d896df68b0ba2e64467afe4983_raw html代码&#xff1a; <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport…