【C语言教程】【常用类库】(十九)异常与错误处理 - <errno.h> 和 <error.h>

19. 异常与错误处理 - <errno.h> 和 <error.h>

在C语言程序开发过程中,处理异常和错误是确保程序稳定性和可靠性的重要部分。常规的错误处理往往依靠错误代码和错误信息进行。而 <errno.h> 提供了一种标准的方法来处理错误------通过errno变量。

19.1. 错误处理与错误代码

errno 是在 C 标准库中定义的一个全局整数变量,它存储着最后一次函数执行所产生的错误代码。使用错误代码可以帮助开发者确定程序执行过程中发生的特定错误。

  • errno 的使用与常见错误代码:

    • 当库函数发生错误时,errno 会被设置为相应的错误代码。
    • 常见的错误码包括 EACCES, EBADF, ENOMEM 等。
    • 错误仅在函数调用失败时有效。因此,应在调用失败后立即检查错误码。
    c 复制代码
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    
    int main() {
        FILE *file = fopen("nonexistent.txt", "r");
        if (file == NULL) {
            printf("Error opening file: %s\n", strerror(errno));
        }
        return 0;
    }
  • perror 和 strerror 的使用:

    • perror:用于直接输出描述最近一次错误的简要消息至标准错误流。
    • strerror:接受一个错误代码,返回该错误的字符串描述,用于更加灵活的错误信息展示。
    c 复制代码
    perror("Error");  // 输出格式为:"Error: 描述信息"
    printf("Error opening file: %s\n", strerror(ENOENT));
19.2. 程序健壮性与错误处理策略

确保程序对各种可能的错误情况做好防御性编程和资源管理,这是提高程序健壮性的重要策略。

  • 错误防御编程:

    • 通常会在可预见的错误发生位置进行检查,并提前做出反应。
    • 通过在每个可能返回错误的函数调用后检查 errno,可以及时响应问题。
  • 资源管理与清理策略(RAII 形态):

    • 资源获取即初始化(RAII)是一种在异常情况下通过对象生命周期来管理资源的策略。
    • 在 C 语言中,可以通过合理使用栈内存和将资源释放包装在析构函数中来实现类似的效果。
19.3. 自定义错误处理机制

在复杂项目中,使用自定义错误码和日志记录,可以使错误管理更为精细。

  • 定义与使用自定义错误码:

    • 可以定义自己的错误码以更好地描述程序中出现的特定问题。
    • 使用枚举(enum)是一种良好的做法,便于管理和维护错误码。
    c 复制代码
    enum {
        MY_ERR_FILE_NOT_FOUND = 1,
        MY_ERR_NETWORK_FAIL,
        MY_ERR_UNKNOWN
    };
  • 错误日志记录与调试辅助工具:

    • 建立错误日志系统以跟踪和记录错误发生的情况和背景。
    • 在调试时,记录详细的错误信息便于分析和修正问题。

通过合理的异常与错误处理机制,可以显著提升程序的鲁棒性和可维护性。

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真6 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes7 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟9 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
阿里嘎多学长10 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
wangchunyu11411 小时前
Python 数据可视化实战入门教程
开发语言·python·信息可视化
wuyk55512 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
学逆向的12 小时前
C 突破编译器限制
c语言·开发语言·网络安全