重回C语言之老兵重装上阵(十五)C语言错误处理
C语言错误处理
在C语言中,错误处理是非常重要的一部分。C语言没有像高级语言(例如Python、Java)那样内建的异常处理机制(如try-catch),但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳定性,帮助开发人员及时发现和解决问题。
1. 返回值检查
C语言的错误处理通常通过函数的返回值来传递错误信息。很多标准库函数会通过返回值表示操作是否成功。如果返回值为特殊值,通常表示发生了错误。
示例:fopen 错误处理
#include <stdio.h>int main() {FILE *file = fopen("nonexistent_file.txt", "r");if (file == NULL) {// 打开文件失败printf("Error: Unable to open file.\n");return 1; // 返回错误码}// 成功打开文件后处理文件内容fclose(file);return 0; // 正常结束
}
分析:
fopen打开文件失败时返回NULL,程序可以通过检查返回值来确认是否发生错误。- 如果失败,程序打印错误信息并返回一个非零的错误码。
2. 使用 errno 和 perror
在很多C语言库函数中,错误会通过设置全局变量 errno 来传递。errno 保存了最近一次系统调用或库函数发生错误时的错误码。
errno定义在<errno.h>中。perror是一个标准库函数,用于打印errno对应的错误信息。
示例:fopen 错误处理使用 errno 和 perror
#include <stdio.h>
#include <errno.h>
#include <string.h>int main() {FILE *file = fopen("nonexistent_file.txt", "r");if (file == NULL) {// 打印详细的错误信息printf("Error opening file: %s\n", strerror(errno));return 1;}fclose(file);return 0;
}
分析:
errno被设置为系统调用失败的错误代码,strerror(errno)用于转换该错误码为易于理解的错误信息。perror也是一个用于输出错误信息的标准函数,它自动结合了errno的值并输出错误消息。
3. assert 宏(调试时使用)
C语言中提供了一个调试工具 assert,用于检查程序中不应该发生的条件。如果条件为假,assert 会打印错误信息并中止程序。
示例:使用 assert 来检查不应发生的条件
#include <stdio.h>
#include <assert.h>int main() {int x = -1;// 检查x是否为正数assert(x >= 0);printf("This will not be printed if x is negative.\n");return 0;
}
分析:
assert(x >= 0)会检查x是否大于或等于0。如果条件不成立(即x为负数),程序将终止,并输出失败的条件表达式。assert仅在调试模式下有效,在发布版本中通常会被禁用。
4. 自定义错误处理函数
在一些复杂的程序中,可以编写自定义的错误处理函数来统一管理错误。例如,可以创建一个 error_handler() 函数,在发生错误时打印详细的错误信息并决定如何恢复或退出程序。
示例:自定义错误处理函数
#include <stdio.h>
#include <stdlib.h>void error_handler(const char *msg) {perror(msg); // 打印系统错误信息exit(EXIT_FAILURE); // 退出程序
}int main() {FILE *file = fopen("nonexistent_file.txt", "r");if (file == NULL) {error_handler("Failed to open file");}fclose(file);return 0;
}
分析:
error_handler函数负责处理错误,打印系统错误信息并终止程序。exit(EXIT_FAILURE)用于退出程序并返回错误状态码。
5. 错误恢复和退出策略
当错误发生时,有时我们可能希望恢复程序的执行而不是直接退出。为了实现这一目标,可以返回错误代码,或者通过其他机制(如设置标志位)来通知程序如何恢复。
示例:通过返回错误代码来处理错误
#include <stdio.h>int divide(int a, int b) {if (b == 0) {printf("Error: Division by zero.\n");return -1; // 返回错误代码}return a / b;
}int main() {int result = divide(10, 0);if (result == -1) {// 错误处理,恢复程序或退出printf("Program could not continue.\n");return 1; // 错误退出}printf("Result: %d\n", result);return 0; // 成功退出
}
分析:
divide()函数在除数为0时返回错误代码-1。- 主程序通过检查返回值来决定如何处理错误。如果发生错误,可以选择退出或恢复操作。
6. 总结
C语言的错误处理主要依赖于以下方法:
- 返回值检查:通过检查函数的返回值来确认操作是否成功。
errno和perror:通过errno获取错误码并使用perror打印系统错误信息。assert:用于调试时检查不应发生的条件。- 自定义错误处理函数:编写统一的错误处理函数,提高程序的可维护性。
- 错误恢复策略:根据返回的错误代码或标志位来决定如何恢复或退出程序。
相关文章:
重回C语言之老兵重装上阵(十五)C语言错误处理
C语言错误处理 在C语言中,错误处理是非常重要的一部分。C语言没有像高级语言(例如Python、Java)那样内建的异常处理机制(如try-catch),但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳…...
使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
一、问题背景 Docker Hub 是 Docker 默认的镜像仓库,但由于网络限制,国内用户直接拉取镜像可能面临以下问题: 下载速度极慢(尤其是大镜像)。连接超时或完全被屏蔽(部分网络环境)。依赖国外源的…...
为AI聊天工具添加一个知识系统 之76 详细设计之17 正则表达式 之4 正则表达式模板
Q712、三“化” (使用三种不同的定义方法:规定定义法 -线性回归/内涵定义法--一阶迭代/外延定义法--单调递归) 整体形成 一个双人零和 的局面 <Class()外延式, Type()内涵式> Method()规定式。给出 问题“law 是什么”的三种答案&#…...
日志收集Day007
1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…...
【Python】 使用pygame库实现新年烟花
祝大家金蛇衔财,蛇来运转 首先,确保你已经安装了 pygame 库。如果还没有安装,可以通过以下命令安装: pip install pygame接下来是烟花效果的 Python 代码: import pygame import random import math import sys# 初始…...
C语言中string.h头文件功能介绍
在C语言的世界里,string.h头文件提供了许多用于处理字符串和内存操作的函数。今天,我们就来深入探讨string.h头文件的功能、使用注意事项以及一些拓展应用。 一、功能介绍 string.h头文件定义了一系列用于操作字符串和内存的函数。这些函数可以分为几个…...
群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
群晖docker获取私有化镜像提示http: server gave HTTP response to HTTPS clien 问题描述 层级时间用户事件Information2023/07/08 12:47:45cxlogeAdd image from xx.xx.31.240:1923/go-gitea/gitea:1.19.3Error2023/07/08 12:47:48cxlogeFailed to pull image [Get "http…...
react antd点击table单元格文字下载指定的excel路径
在使用 Ant Design (antd) 的 Table 组件时,如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件,可以通过以下步骤实现: 1. 确保有一个可供下载的 Excel 文件:需要有一个服务器端点或者一个可以直接访问的 URL…...
《哈佛家训》
《哈佛家训》是2010年由威廉贝纳德撰写,张玉翻译,在中国妇女出版社出版的专著。书中有许多富有哲理的故事,传达了诸多教育理念和人生智慧,以下是一些例子及相应启示: ### 眼界与格局方面 - **故事**:小伙子…...
ResNeSt: Split-Attention Networks论文学习笔记
这张图展示了一个名为“Split-Attention”的神经网络结构,该结构在一个基数组(cardinal group)内进行操作。基数组通常指的是在神经网络中处理的一组特征或通道。图中展示了如何通过一系列操作来实现对输入特征的注意力机制。 以下是图中各部…...
【matlab】绘图 离散数据--->连续函数
matlab绘图练习 离散数据及离散函数对离散区间进行细划分 达到连续效果画plot(y)图 与 复数的应用 离散数据及离散函数 例1 x1[1 2 4 6 7 8 10 11 12 14 16 17 18 20] y1[1 2 4 6 7 8 10 10 8 7 6 4 2 1] figure(1); plot(x1,y1,o,MarkerSize,15); x21:20; y2log(x2); figure…...
pyside6-uic form.ui -o ui_form.py 的作用
pyside6-uic form.ui -o ui_form.py 的作用 pyside6-uic form.ui -o ui_form.py 这个命令是用来将 .ui 文件转换为 Python 代码文件的工具。 具体作用: pyside6-uic:这是一个命令行工具,用于将用 Qt Designer 或其他图形界面工具创建的 .ui …...
Qt中QVariant的使用
1.使用QVariant实现不同类型数据的相加 方法:通过type函数返回数值的类型,然后通过setValue来构造一个QVariant类型的返回值。 函数: QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…...
基础项目实战——3D赛车(c++)
目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动九、曲线轨道十、课山坡轨道十一、循环轨道十二、背景展示十三、引入速度十四、物品绘制十五、课数字路障十六、分数展示十七、重新生成十八、…...
【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…...
每日一题 430. 扁平化多级双向链表
430. 扁平化多级双向链表 简单 /*class Solution { public:Node* flatten(Node* head) {Node* tail nullptr;return dfs(head);}Node* dfs(Node* head){Node* cur head;while(cur ! nullptr){if(cur->child ! nullptr){Node* curChild getTail(cur->child);Node* te…...
vue3表格数据分2个表格序号连续展示
一、el-table表格在弹窗里面分两个表格展示。 假设我们有一个数组 tableData,我们希望在第一个表格中展示前半部分的数据,第二个表格中展示后半部分的数据。 <template><el-button type"primary" click"dialogVisible true&q…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
一文讲解Java中Object类常用的方法
在Java中,经常提到一个词“万物皆对象”,其中的“万物”指的是Java中的所有类,而这些类都是Object类的子类; Object主要提供了11个方法,大致可以分为六类: 对象比较: public native int has…...
操作系统之输入输出
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【Convex Optimization Stanford】Lec3 Function
【Convex Optimization Stanford】Lec3 Function 前言凸函数的定义对凸函数在一条线上的限制增值扩充? 一阶条件二阶条件一些一阶/二阶条件的例子象集和sublevel set关于函数凸性的扩展(Jesen Inequality)保持函数凸性的操作非负加权和 & 仿射函数的…...
【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一…...
SpringBoot或SpringAI对接DeekSeek大模型
今日除夕夜,deepseek可是出尽了风头,但是我看网上还没有这方面的内容对接,官网也并没有,故而本次对接是为了完成这个空缺 我看很多的博客内容是流式请求虽然返回时正常的,但是他并不是实时返回,而是全部响应…...
Funnel-Transformer:通过过滤序列冗余实现高效语言处理
摘要 随着语言预训练的成功,开发更具扩展性且能高效利用大量未标注数据的架构变得尤为重要。为了提高效率,我们研究了在维持完整token级别表示时的冗余问题,尤其是对于仅需要序列单向量表示的任务。基于这一直觉,我们提出了Funne…...
【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索(BFS)解决最短路…...
【算法】经典博弈论问题——威佐夫博弈 python
目录 威佐夫博弈(Wythoff Game)【模板】 威佐夫博弈(Wythoff Game) 有两堆石子,数量任意,可以不同,游戏开始由两个人轮流取石子 游戏规定,每次有两种不同的取法 1)在任意的一堆中取走任意多的石子 2)可以在两堆中同时取走相同数量…...
CUDA学习-内存访问
一 访存合并 1.1 说明 本部分内容主要参考: 搞懂 CUDA Shared Memory 上的 bank conflicts 和向量化指令(LDS.128 / float4)的访存特点 - 知乎 1.2 share memory结构 图1.1 share memory结构 放在 shared memory 中的数据是以 4 bytes(即 32 bits)作为 1 个 word,依…...
力扣动态规划-13【算法学习day.107】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...
《剪映5.9官方安装包》免费自动生成字幕
(避免失效建议存自己网盘后下载)剪映5.9官方Win.Mac 链接:https://pan.xunlei.com/s/VOHc-Fg2XRlD50MueEaOOeW1A1?pwdawtt# 官方唯一的免费版,Win和Mac都有,此版本官方已下架,觉得有用可转存收藏…...
ESP32-S3模组上跑通esp32-camera(32)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(31) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回开始解析camera_probe函数的第8段即最后一段代码,本回继续解析该段代码。为了便于理解和回顾,再次贴出camera_probe函数源码,在components/esp32-camera/drive…...
