C# 捕获异常后函数运行时长不足1小时如何重启重试?
实现方案
这个功能需要使用循环结构实现,不推荐用goto语法跳转到逻辑开头,循环的实现方式可读性和可维护性都更高。
核心逻辑
- 函数启动时先记录当前时间作为起始时间
- 套一层循环包裹你的业务逻辑+异常捕获代码
- 异常触发时计算当前时间和起始时间的差值:
- 差值小于1小时:继续下一轮循环重试业务逻辑
- 差值大于等于1小时:退出循环,抛出异常/做兜底处理
- 如果业务逻辑正常执行完成,直接退出循环结束函数即可
补充:如果非要不用循环也可以用
goto语法实现,但是完全不推荐,goto会大幅降低代码可读性,后续维护成本极高,循环是更合理的方案。
代码示例
public void myFunct() { // 记录函数启动时间 DateTime startTime = DateTime.Now; // 可根据需要调整重试间隔,避免无意义的高频重试 int retryIntervalSeconds = 10; while (true) { try { // 你的业务逻辑 DoSomeWork(); // 逻辑执行成功,直接退出循环结束函数 return; } catch (Exception ex) { // 计算已运行时长 TimeSpan elapsed = DateTime.Now - startTime; // 时长不足1小时则重试 if (elapsed.TotalHours < 1) { // 可选:打日志记录异常和重试信息 Console.WriteLine($"触发异常:{ex.Message},{retryIntervalSeconds}秒后重试,剩余可重试时长:{(TimeSpan.FromHours(1) - elapsed).TotalMinutes:F1}分钟"); // 等待一段时间再重试,避免高频请求压垮依赖服务 Thread.Sleep(retryIntervalSeconds * 1000); continue; } // 超过1小时不再重试,抛出异常或者做兜底处理 Console.WriteLine($"运行超过1小时仍报错,终止重试,最后一次异常:{ex.Message}"); throw; } } }
注意事项
- 不要无脑捕获所有
Exception类型,建议只捕获你预期会出现的、可重试的异常类型(比如网络调用异常、IO临时异常等),避免代码逻辑bug(比如空引用、参数非法)导致无意义的重试 - 如果你的业务逻辑是异步的,把
Thread.Sleep换成await Task.Delay即可,函数返回值改成async Task - 可以根据业务需要调整重试间隔,比如用指数退避策略(第一次等1秒,第二次2秒,第三次4秒,最多到某个上限),进一步降低依赖服务的压力
内容的提问来源于stack exchange,提问作者Lightsout
相关产品推荐
相关产品推荐

