跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C/C++ 错误处理机制与常用函数详解

C/C++ 编程中的错误捕获与处理方法。主要涵盖全局变量 errno 及其配合 perror() 和 strerror() 输出错误信息的用法,对比了两者区别及适用场景。此外还讲解了程序终止函数 exit() 与 abort() 的区别,调试宏 assert() 的使用,以及非局部跳转 setjmp() 和 longjmp() 的原理。最后列举了常见的错误码如 ENOMEM、EINVAL 等及相关系统函数 fopen、socket 等的错误判断方式,帮助开发者有效定位和报告程序错误。

樱花落尽发布于 2026/3/30更新于 2026/10/22102 浏览
C/C++ 错误处理机制与常用函数详解

在 C/C++ 编程中,错误信息的捕获和处理是保证程序健壮性的重要部分。错误通常通过函数的返回值或者全局变量 errno 来表示。为了方便调试和错误处理,C/C++ 提供了多种函数和方法来获取和输出错误信息。以下是 C/C++ 错误处理的常见方法及函数介绍:

1. errno 和 perror()

  • errno:errno 是一个全局变量,当系统调用或库函数失败时,它会被设置为一个错误代码。errno 是由操作系统在发生错误时设置的,每个错误代码代表特定类型的错误。
  • perror():perror() 用于打印基于 errno 错误码的错误信息。它将 errno 的值转换为对应的错误消息并输出。如果提供了自定义的前缀字符串,则会一起输出。
示例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (!file) {
        perror("File opening failed");
    }
    return 0;
}

输出:

File opening failed: No such file or directory

在此例中,perror() 输出了一个由 errno 设置的错误信息,具体是'没有这样的文件或目录'。

2. strerror()

  • strerror():strerror() 函数用于将 errno 错误代码转换为可读的字符串,返回与 errno 对应的错误消息的指针。可以在程序中直接调用它来获取详细的错误描述。
示例:
#include <stdio.h>
# 

{
    FILE *file = (, );
     (!file) {
        (, (errno));
    }
     ;
}
include
<errno.h>
#include <string.h>
int main()
fopen
"non_existent_file.txt"
"r"
if
printf
"Error: %s\n"
strerror
return
0

输出:

Error: No such file or directory

3. perror() 和 strerror() 区别

  • perror() 会自动将错误信息输出到标准错误流 stderr,并可以附带自定义的前缀。
  • strerror() 返回一个指向错误信息的指针,可以在程序中自己控制输出。

4. exit() 和 abort()

  • exit():exit() 用于退出程序并返回一个指定的状态码。返回的状态码可以用来表示程序的执行状态,通常 0 表示成功,非零值表示错误。
示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
    if (some_error_condition) {
        fprintf(stderr, "An error occurred\n");
        exit(1); // Exit with status 1 (error)
    }
    return 0;
}
  • abort():abort() 用于立即终止程序,通常在程序遇到无法恢复的错误时使用。调用 abort() 后,程序会立即中止,并且返回一个未定义的错误状态。
示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
    if (some_fatal_error) {
        abort(); // Immediately terminate the program
    }
    return 0;
}

5. assert()

  • assert():assert() 是用于调试时的一个宏,检查条件表达式是否为真。如果条件不为真,程序会输出错误信息并调用 abort() 终止程序。assert() 主要用于开发和调试阶段,不应该用于生产代码。
示例:
#include <assert.h>
#include <stdio.h>
int main() {
    int x = 5;
    assert(x == 10); // This will fail and abort the program
    return 0;
}

6. setjmp() 和 longjmp()

  • setjmp():setjmp() 用于设置一个恢复点。如果程序在后续调用 longjmp() 时跳转到该恢复点,setjmp() 会返回一个非零值。
  • longjmp():longjmp() 用于从 setjmp() 所在的地方跳转到程序的某个恢复点。它可以用于错误处理,但一般不推荐作为常规的错误处理机制。
示例:
#include <setjmp.h>
#include <stdio.h>
jmp_buf env;
void error_recovery() {
    printf("Error occurred, recovering...\n");
    longjmp(env, 1); // Jump back to setjmp
}
int main() {
    if (setjmp(env) != 0) {
        printf("Recovered from error\n");
        return 0;
    }
    error_recovery(); // Call this to simulate error
    return 0;
}

7. strerror_r()

  • strerror_r():strerror_r() 是线程安全的 strerror() 版本,它将错误信息写入传入的缓冲区中。由于 strerror() 不是线程安全的(它使用静态缓冲区),所以在多线程程序中推荐使用 strerror_r()。
示例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
    char buf[256];
    errno = ENOENT;
    strerror_r(errno, buf, sizeof(buf));
    printf("Error: %s\n", buf);
    return 0;
}

8. perror() 和 strerror() 适用场景

  • perror():适用于错误发生时立即输出错误信息,通常与文件操作、系统调用等直接相关的错误。
  • strerror():适用于在多个地方需要引用或自定义错误消息输出的场景,尤其在日志记录和调试时很有用。

常见的 C/C++ 错误信息和函数

常见的错误信息
  • ENOMEM:内存不足
  • EAGAIN:暂时不可用,通常表示资源忙或阻塞
  • EINVAL:无效参数
  • EBADF:无效的文件描述符
  • EIO:输入/输出错误
  • EPERM:操作不允许
  • ENOENT:没有文件或目录
常见的函数
  • fopen()、open():文件打开错误,返回 NULL 或 -1,需要使用 errno 判断具体错误。
  • socket():创建套接字时的错误。
  • connect()、send()、recv():网络编程中的错误。

总结

C/C++ 提供了一系列强大的错误处理机制,包括全局变量 errno 和函数 perror()、strerror() 等来输出和捕获错误信息。通过合理地使用这些函数,可以有效地捕获并报告程序中的错误,帮助开发人员在调试和生产环境中定位问题。

目录

  1. 1. errno 和 perror()
  2. 示例:
  3. 2. strerror()
  4. 示例:
  5. 3. perror() 和 strerror() 区别
  6. 4. exit() 和 abort()
  7. 示例:
  8. 示例:
  9. 5. assert()
  10. 示例:
  11. 6. setjmp() 和 longjmp()
  12. 示例:
  13. 7. strerror_r()
  14. 示例:
  15. 8. perror() 和 strerror() 适用场景
  16. 常见的 C/C++ 错误信息和函数
  17. 常见的错误信息
  18. 常见的函数
  19. 总结

更多推荐文章

查看全部
  • RexUniNLU 集成 Rasa 对话系统:零样本 NLU 实战
  • Spring WebFlux 深度实践指南
  • ClawPanel:OpenClaw 智能管理面板,支持多通道接入与多模型配置
  • 昇腾 NPU 运行 Llama 模型:环境搭建与性能测试
  • OpenClaw:从认知到行动的智能体框架解析
  • 二叉搜索树 C++ 简单实现:增删查改详解
  • AI 生成 UI 工具评测与工程化实践指南
  • 程序员如何系统学习数据结构和算法
  • LangGraph 构建 Agent 逐步指南
  • C++ 工厂模式与单例模式深度应用
  • Python 极简版 OpenClaw Agent:openclaw-mini 架构解析
  • AI 自主化演进双重突破:MiniMax M2.7 自我进化模型与小鹏 VLA 自动驾驶
  • AI 学术写作与查重工具功能解析
  • Llama-3.2-3B + Ollama 本地部署实战指南
  • 开源大模型 Image-to-Video 本地化部署教程
  • Mac 本地部署 OpenClaw 智能助理框架教程
  • AI 结合存储:智能存储的落地思路与坑点
  • Python 基础语法入门:常量、变量与运算符
  • Qwen3-VL 视觉模型微调实战:LLaMA-Factory 与 WEBUI 部署
  • GitHub Copilot 学生认证指南:两年免费 Pro 权益申请流程

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online