You need to enable JavaScript to run this app. C# 捕获异常后函数运行时长不足1小时如何重启重试?
优惠活动
大模型
产品
解决方案
定价
更多

C# 捕获异常后函数运行时长不足1小时如何重启重试?

实现方案

这个功能需要使用循环结构实现,不推荐用goto语法跳转到逻辑开头,循环的实现方式可读性和可维护性都更高。

核心逻辑

  1. 函数启动时先记录当前时间作为起始时间
  2. 套一层循环包裹你的业务逻辑+异常捕获代码
  3. 异常触发时计算当前时间和起始时间的差值:
    • 差值小于1小时:继续下一轮循环重试业务逻辑
    • 差值大于等于1小时:退出循环,抛出异常/做兜底处理
  4. 如果业务逻辑正常执行完成,直接退出循环结束函数即可

补充:如果非要不用循环也可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 00:36:00