C/C++错误信息

C/C++错误信息

目录

1. errno 和 perror()

示例:

2. strerror()

示例:

3. perror() 和 strerror() 区别

4. exit() 和 abort()

示例:

示例:

5. assert()

示例:

6. setjmp() 和 longjmp()

示例:

7. strerror_r()

示例:

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

常见的 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> #include <errno.h> #include <string.h> int main() { FILE *file = fopen("non_existent_file.txt", "r"); if (!file) { printf("Error: %s\n", strerror(errno)); } 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() 等来输出和捕获错误信息。通过合理地使用这些函数,可以有效地捕获并报告程序中的错误,帮助开发人员在调试和生产环境中定位问题。

Read more

2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换 题目描述 Alice 不喜欢 4,喜欢 8,她想把 4 全换成 8,若无 4 则不修改。 输入格式 输入一行,一个整数 A,表示替换前的数。 输出格式 输出一行,包含一个整数 B,表示替换后的数。 样例 样例 1: 输入: 8459045 输出: 8859085 样例 2: 输入: 123 输出: 123 数据范围 * 0 ≤ A ≤ 10 9 0 \leq A \leq 1

By Ne0inhk
基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南

基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南

基于飞算 JavaAI 高效开发电商系统核心功能模块实战指南 在电商系统开发领域,效率与稳定性始终是开发者追求的核心目标。传统 Java 开发模式下,电商系统的商品管理、订单处理、支付集成等核心模块往往需要大量重复编码、复杂的异常处理和繁琐的性能优化工作。飞算 JavaAI 作为新一代智能开发工具,通过 AI 驱动的代码生成、自动化测试与性能优化能力,可将电商核心模块的开发效率提升 60% 以上。本文将以主流电商系统的三大核心模块为例,详细讲解如何利用飞算 JavaAI 实现从需求定义到上线部署的全流程高效开发。 一、飞算 JavaAI 电商开发环境准备 1.1 开发环境配置 打开Idea,戳进插件市场(快捷键:Ctrl+Alt+S),搜索‘CalEx-JavaAI’或者’飞算’,安装完成后重启,并登录飞算。 1.2 核心技术栈说明 技术组件版本飞算 JavaAI

By Ne0inhk
毕业设计--15614基于Java的餐馆管理系统的设计与实现(案例分析)-附源码

毕业设计--15614基于Java的餐馆管理系统的设计与实现(案例分析)-附源码

摘  要 以满足现代餐饮业日益复杂的管理需求,本研究设计并实现一个基于Java的餐馆管理系统。采用Spring Boot框架和MySQL数据库,系统主要分为顾客用户、管理员以及员工用户三大模块。对于顾客用户,系统提供了包括注册、登录、浏览餐厅资讯与菜品信息、商城购物、查看餐厅信息、账户管理及个人中心等功能;个人中心内还集成了预约信息、订单配送状态跟踪、收藏夹和评论管理等特色服务。管理员则通过后台进行全局性的操作,如销售数据统计分析、系统用户管理、餐厅信息及其评论的维护、预约审核、轮播图设置、公告信息发布、新闻资讯更新以及全面的商城管理。员工用户功能相对聚焦,重点在于登录验证后对其负责餐厅的信息查看、预约审核以及特定范围内的商城管理任务执行。整个系统的设计与实现充分考虑了用户体验、数据安全性和操作便捷性,力求为餐饮行业提供一套高效、实用的信息化解决方案。 关键词:餐馆管理系统;Spring Boot;Java;MySQL ABSTRACT To meet the increasingly complex management needs of the modern

By Ne0inhk
基于 Java + SpringBoot + Vue + MySQL 的考试报名系统实战指南

基于 Java + SpringBoot + Vue + MySQL 的考试报名系统实战指南

🎓 基于 Java + SpringBoot + Vue + MySQL 的考试报名系统实战指南 🌟 项目简介 本文分享一个基于 Java + SpringBoot + Vue + MySQL 构建的完整考试报名系统。该项目适合用于毕业设计、课程设计或企业级开发学习参考,功能模块齐全,代码结构清晰。 🧩 核心功能模块 * 用户登录 / 注册 * 学生信息管理 * 教师信息管理 * 考试信息管理 * 考试报名管理 * 准考证管理 * 考试成绩管理 * 论坛交流 * 其它功能… 🖼️ 系统界面预览 ⚙️ 运行环境与工具要求 为了确保项目顺利运行,请确认您的开发环境满足以下条件: ✅ 推荐配置 * Java: JDK 1.8 * MySQL: 8.0.41 * Node.js: 16.20.2 ⚠️ 注意:版本不一致可能导致依赖冲突或启动失败。 🛠️ 开发工具 * 后端:

By Ne0inhk