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

学 C++ 继承看这篇!派生类函数实现 + 虚继承原理 + IO 库菱形案例,果断收藏

学 C++ 继承看这篇!派生类函数实现 + 虚继承原理 + IO 库菱形案例,果断收藏

✨ 孤廖:个人主页 🎯 个人专栏:《C++:从代码到机器》 🎯 个人专栏:《Linux系统探幽:从入门到内核》 🎯 个人专栏:《算法磨剑:用C++思考的艺术》 折而不挠,中不为下 文章目录 * 正文: * 1. 继承的概念和定义 * 概念: * 定义: * 继承类模板 * 2. 基类和派⽣类间的转换 * 3. 继承中的作⽤域' * 隐藏规则: * 4. 派⽣类的默认成员函数 * 4个常⻅默认成员函数 * 实现一个不能被继承的类 * 5. 继承与友元 * 6. 继承与静态成员 * 7. 多继承及其菱形继承问题 * 继承模型: * 虚继承 * 8. 继承和组合 * 结语: 正文: 1. 继承的概念和定义 概念:

By Ne0inhk
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究

【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】 目录 1、将日志加到线程池 1.1、Thread类 1.2、ThreadPool类 1.2.1、HandlerTask() 1.2.2、其他公有成员函数 1.3、主函数 2、单例版线程池 2.1、私有成员函数 2.2、获取对象函数 2.2.1、不加锁版本 2.2.2、加锁版本 3、可重入VS线程安全 3.1、概念 3.

By Ne0inhk
C++轻量客户端+浏览器:优雅的本地文件共享解决方案

C++轻量客户端+浏览器:优雅的本地文件共享解决方案

2025年12月31日 界面更新 在日常工作和学习中,你是否经常遇到这样的场景: * 需要在手机和平板上查看电脑里的文件 * 想给同事快速分享一个大文件,但网盘太慢 * 需要从不同设备访问同一个项目目录 * 想在局域网内搭建简单的文件服务器,但又不想配置复杂的FTP或Samba 今天给大家推荐一款我开发的小工具——DirectoryServer,一个基于Windows 11现代风格GUI的目录共享服务器,让你通过网页浏览器就能轻松访问本地文件! 功能亮点 🎨 现代化Windows 11界面 * 原生Windows体验:遵循Windows 11设计语言,完美融入系统 * 深色模式支持:自动适应系统主题,夜间使用更舒适 * 简洁直观:没有复杂设置,一键启动,即刻使用 🌐 跨平台文件访问 * 网页浏览器访问:任何设备(手机、平板、其他电脑)通过浏览器即可访问 * 无需安装客户端:访问端无需任何特殊软件 * 实时目录浏览:像使用本地文件管理器一样浏览远程目录 ⚡ 高效便捷 * 一键启动/停止:简单的开始和停止按钮 * 自动URL生

By Ne0inhk

CCF-GESP计算机学会等级考试2025年12月四级C++T2 优先购买

B4452 [GESP202512 四级] 优先购买 题目描述 小 A 有 MMM 元预算。商店有 NNN 个商品,每个商品有商品名 SSS、价格 PPP 和优先级 VVV 三种属性,其中 VVV 为正整数,且 VVV 越小代表商品的优先级越高。 小 A 的购物策略为: * 总是优先买优先级最高的东西; * 如果有多个最高优先级商品,购买价格最低的; * 如果有多个优先级最高且价格最低的商品,购买商品名字典序最小的。 小 A 想知道能购买哪些商品。 输入格式 第一行两个正整数 M,NM, NM,N,代表预算和商品数。 之后 NNN 行,每行一个商品,依次为 Si

By Ne0inhk