c++如何实现文件读写操作的自动重试机制(容错设计)【技巧】

星宇姑娘_1535

星宇姑娘_1535

2026-04-08

540人浏览

原创

应为文件打开/创建失败设计可控重试机制,优先重试路径创建和文件打开,区分可重试(eagain、etimedout等)与不可重试错误(enoent、eperm等),采用指数退避(如100ms→300ms→900ms)并限制最大次数(如5次),用std::this_thread::sleep_for跨平台休眠,封装为支持自定义打开逻辑和策略的模板函数。

c++如何实现文件读写操作的自动重试机制(容错设计)【技巧】

遇到 std::filesystem::create_directories 或 fopen 失败时,别直接抛异常

文件操作失败(如磁盘满、权限不足、网络存储临时不可达)在生产环境很常见,但 C++ 标准库本身不提供重试逻辑。直接让 std::ofstream 构造失败或 fopen 返回 nullptr 就退出,等于把容错责任甩给调用方。实际要做的,是把“打开→写入→关闭”这个链路中**最易失败的环节**(通常是打开/创建)包裹进可控重试。

  • 优先对路径创建和文件打开做重试,而非每次写入都重试——写入失败往往意味着句柄已损坏,重试无意义
  • 避免在 std::ofstream 构造时就失败:改用 std::ofstream::open() 配合循环,方便捕获并重试
  • Windows 下注意 ERROR_SHARING_VIOLATION 类错误(文件被其他进程锁住),Linux 下注意 EACCES 和 ENOSPC,这些都需要差异化处理

用 std::this_thread::sleep_for 控制重试间隔,别用忙等待

重试不是越快越好。瞬间连发 10 次 fopen,既加重 I/O 压力,又可能触发系统级限流(比如某些 NFS 服务会返回 ETIMEDOUT)。真实场景中,200ms 到 2s 的指数退避更稳妥。

  • 基础策略:首次失败后等 100ms,第二次等 300ms,第三次等 900ms(即 base * 3^(n-1))
  • 必须设最大重试次数(如 5 次),否则遇到永久性错误(如路径根本不存在且无法创建)会卡死
  • 不要用 usleep 或 nanosleep:C++11 起统一用 std::this_thread::sleep_for(std::chrono::milliseconds(…)),跨平台且可被中断

区分错误类型决定是否重试:errno 和 std::filesystem::filesystem_error 是关键

不是所有错误都值得重试。比如 ENOENT(文件不存在)对只读打开是致命错误,但对写入场景,可能只是父目录缺失——这时该先重试 std::filesystem::create_directories,再重试打开。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 可重试的典型错误:EAGAIN、EWOULDBLOCK、ETIMEDOUT、ENETDOWN、ENETUNREACH
  • 不可重试的错误:ENOENT(目标路径非法)、EPERM(权限拒绝且无提升可能)、EMFILE(进程打开文件数超限)
  • 用 std::filesystem::status(path).type() == std::filesystem::file_type::not_found 判断目录是否存在,比依赖 errno 更可靠

封装成模板函数时,把「打开方式」和「重试策略」作为参数传入

硬编码重试 3 次、每次等 500ms 的函数很快就会不够用。实际项目里,日志写入可能容忍 1s 延迟,而配置热加载必须 200ms 内完成,否则服务启动失败。

  • 函数签名建议类似:template<typename openfunc> std::optional<:file> retry_fopen(const char* path, const char* mode, OpenFunc&& open_func, int max_tries = 3)</:file></typename>
  • 把具体打开逻辑(如 fopen、std::ofstream::open、甚至自定义的 mmap 打开)抽成回调,便于测试和替换
  • 记录每次失败的 errno 或异常信息到本地缓冲区,最后一起输出——避免重试 5 次就打 5 行重复日志

重试逻辑真正难的不是代码量,而是判断“此刻该不该再试一次”。同一个 errno,在容器环境里可能是 cgroup I/O throttling 导致的暂时阻塞,在嵌入式设备上却可能是 SD 卡物理损坏的前兆。留好错误上下文,比写死重试次数重要得多。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2078

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5819

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

2865

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

3628

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2565

10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3139

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2698

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1468

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2479

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习