C 语言错误处理最佳实践:errno、perror 与 strerror 详解
C 语言本身不直接提供错误处理机制,但作为系统编程语言,它通过返回值提供底层访问。大多数 C 或 Unix 函数调用出错时返回 -1 或 NULL,并设置全局错误码 errno。errno 为全局变量,指示函数调用期间发生的错误。各种错误码定义在 <error.h> 头文件中。
C 程序员可检查返回值,根据返回值采取相应措施。良好习惯:程序初始化时将 errno 设为 0,值为 0 表示无错误。
errno、perror() 与 strerror()
C 语言提供 perror() 和 strerror() 函数,用于显示与 errno 关联的文本信息。
perror() 显示传入的字符串,后跟冒号、空格,再显示当前
errno的文本表示。strerror() 返回指向当前
errno文本表示的指针。
下例模拟打开不存在文件的错误,演示两函数用法(实际可任选一种)。注意:应使用 stderr 文件流输出所有错误。
Live Demo#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main() {
FILE *pf;
int errnum;
pf = fopen("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror(errnum));
} else {
fclose(pf);
}
return 0;
}
编译执行输出:
Value of errno: 2 Error printed by perror: No such file or directory Error opening file: No such file or directory
除零错误
常见问题:除法运算前未检查除数是否为零,导致运行时错误。下面代码在除法前检查除数:
Live Demo#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 0;
int quotient;
if (divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient);
exit(0);
}
编译执行输出:
Division by zero! Exiting...
程序退出状态
通用做法:成功退出用 EXIT_SUCCESS(宏,定义为 0);出错退出用 EXIT_FAILURE(定义为 -1)。改写上例:
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 5;
int quotient;
if (divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient);
exit(EXIT_SUCCESS);
}
编译执行输出:
Value of quotient : 4
C语言
- 动力传输皮带存储与搬运最佳实践
- 理解物料搬运:核心概念与最佳实践
- 高效作业四大核心物料搬运设备类别全解析
- 物料搬运安全体系:从文化建设到精细化操作的零伤害实践
- 掌握ADC代码错误率:核心要点解析
- C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
- C# 文件操作实战指南:Exists、ReadAllLines、ReadAllText、Copy、Delete
- C++异常处理全攻略:try/catch/throw机制、标准异常体系与自定义异常
- 掌握 C++ 信号处理:安全中断管理与优雅程序终止
- C# 异常处理完全指南:try-catch-finally、异常类型、自定义异常与最佳实践
- Python 异常处理全攻略:从入门到精通
- 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解