C语言:错误处理
2023-02-18 16:40:17 时间
这是很基础的教程,我只是写给自己看,作为一个学习笔记记录一下,如果正在阅读的你觉得简单,请不要批评,可以关掉选择离开
如何学好一门编程语言
- 掌握基础知识,为将来进一步学习打下良好的基础。
- 上机实践,通过大量的例题学习怎么设计算法,培养解题思路。
- 养成良好的编码习惯,注释一定要写,要不然保你一周后自己写的代码都不认识了
C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。
在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个 错误代码 errno ,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。
所以,我们可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。
错误处理相关函数
perror("字符串") 打印: 字符串: 当前errno值的文本表示形式
strerror(errno) 返回一个指针,指针指向当前errno值的文本
案例:打开一个不存在的文件。使用上面的函数来输出错误消息,另外有一点需要注意,我们使用 fprintf 的时候应该使用 stderr 文件流来输出所有的错误。
#include <stdio.h> #include <errno.h> #include <string.h> extern int errno; // 只声明但不定义,errno在其他文件中已经定义了 int main(){ FILE* pf; // 声明文件类型的指针 int errnum; pf = fopen("unexist.txt", "rb"); if (pf == NULL){ errnum = errno; fprintf(stderr, "错误号: %d\n", errno); //错误号: 2 perror("通过 perror 输出错误"); //通过 perror 输出错误 : No such file or directory fprintf(stderr, "打开文件错误: %s\n", strerror(errnum)); //打开文件错误 : No such file or directory } else{ fclose(pf); } return 0; }
在进行除法运算时,因此我们可以提前检查 分母 是否为零,避免运行时错误。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "除数为 0 退出运行...\n"); // 除数为 0 退出运行... exit(-1); } quotient = dividend / divisor; fprintf(stderr, "quotient 变量的值为 : %d\n", quotient ); exit(0); }
如果 程序运行工程,会返回宏 EXIT_SUCCESS,它被定义为 0。
如果程序运行失败,退出程序时会带有状态值 EXIT_FAILURE,被定义为 -1。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0){ fprintf(stderr, "除数为 0 退出运行...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "quotient 变量的值为: %d\n", quotient ); exit(EXIT_SUCCESS); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
quotient 变量的值为 : 4
参考
相关文章
- NodeJS使用FFMPEG获取视频封面
- IPC$横向移动
- 基于深度学习的【木板】表面缺陷检测与识别
- OpenCV快速识别魔方六面颜色
- 基于图割算法的木材表面缺陷图像分割
- 金九银十,收下这份 Java String 面试题
- 从图灵机到量子计算机,计算机可以解决所有问题吗?
- 一套用了 70 年的计算机架构 —— 冯·诺依曼架构
- 图解计算机内部的高速公路 —— 总线系统
- 图解计算机的存储器金字塔
- 面试官:什么是伪共享,如何避免?
- 为什么计算机中的负数要用补码表示?
- 宝塔部分用户被挂马,官方建议暂时关闭面板
- 七天接手react项目 系列 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法
- Redis的数据被删除,占用内存咋还那么大?
- Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵
- Redis进阶篇:发布订阅模式原理与运用
- Redis 内存优化神技,小内存保存大数据
- SpringBoot 集成缓存性能之王 Caffeine
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题