亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言错误处理最佳实践:errno、perror 与 strerror 详解

C 语言本身不直接提供错误处理机制,但作为系统编程语言,它通过返回值提供底层访问。大多数 C 或 Unix 函数调用出错时返回 -1 或 NULL,并设置全局错误码 errno。errno 为全局变量,指示函数调用期间发生的错误。各种错误码定义在 <error.h> 头文件中。

C 程序员可检查返回值,根据返回值采取相应措施。良好习惯:程序初始化时将 errno 设为 0,值为 0 表示无错误。

errno、perror() 与 strerror()

C 语言提供 perror() 和 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)。改写上例:

Live Demo
#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语言

  1. 动力传输皮带存储与搬运最佳实践
  2. 理解物料搬运:核心概念与最佳实践
  3. 高效作业四大核心物料搬运设备类别全解析
  4. 物料搬运安全体系:从文化建设到精细化操作的零伤害实践
  5. 掌握ADC代码错误率:核心要点解析
  6. C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
  7. C# 文件操作实战指南:Exists、ReadAllLines、ReadAllText、Copy、Delete
  8. C++异常处理全攻略:try/catch/throw机制、标准异常体系与自定义异常
  9. 掌握 C++ 信号处理:安全中断管理与优雅程序终止
  10. C# 异常处理完全指南:try-catch-finally、异常类型、自定义异常与最佳实践
  11. Python 异常处理全攻略:从入门到精通
  12. 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解