You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个不同函数复用相同的5次重试while循环逻辑?

复用重试逻辑的重构方案

我来帮你搞定这段重复代码的问题!核心思路是把重复的重试逻辑抽成通用方法,把不同的业务操作作为参数传递进去,这样两个函数就能共享同一段重试逻辑,还能保持各自的业务独立性。

第一步:定义函数式接口封装业务操作

首先我们需要一个函数式接口,用来封装那些可能抛出IOException的操作,这样才能把不同的业务逻辑(获取HTML、下载文件)当成参数传给通用重试方法:

@FunctionalInterface
public interface RetryableOperation<T> {
    T execute() throws IOException;
}

第二步:编写通用的重试方法

接下来实现通用的重试逻辑,把原来两个函数里的while循环、重试计数、异常捕获和日志都放在这里:

private <T> T executeWithRetry(RetryableOperation<T> operation) {
    int retries = 0;
    while (retries < 5) {
        try {
            // 执行传入的业务操作
            return operation.execute();
        } catch (IOException e) {
            LOGGER.logWarn("Problem Occured While Downloading The File= " + e.getMessage());
            retries += 1;
        }
    }
    // 5次重试都失败,返回null
    return null;
}

第三步:修改原有方法调用通用逻辑

现在把原来的getHtml和getFile方法简化,只保留各自的业务逻辑,通过lambda表达式传给通用重试方法:

public Document getHtml(String url) {
    return executeWithRetry(() -> Jsoup.connect(url).get());
}

@Override
public String getFile(String url) {
    return executeWithRetry(() -> {
        URL urlObj = new URL(url);
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        try (InputStream is = urlObj.openStream()) {
            while ((length = is.read(buffer)) != -1) {
                result.write(buffer, 0, length);
            }
        }
        return result.toString("UTF-8");
    });
}

为什么这么做?

  • 符合DRY原则:再也不用在两个地方写一模一样的重试逻辑了,后续要修改重试次数(比如改成3次)或者日志格式,只需要改executeWithRetry这一个地方。
  • 代码更清晰:原有方法只专注于自己的业务逻辑,重试逻辑被封装在通用方法里,职责分明。
  • 扩展性强:如果以后新增其他需要重试的操作,直接调用executeWithRetry传入对应的业务逻辑即可。

内容的提问来源于stack exchange,提问作者user3774135

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:03:12