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

如何用try和repeat包裹while循环以在特定错误时重新执行

网页数据采集R代码异常重试实现方案

针对网页采集时因404错误或特定报错中断的问题,以下是修改后的代码,通过repeat+try实现触发目标错误时自动重置变量并从头执行的逻辑:

# 定义需要监测的特定错误信息
target_error <- "Error in if (nrow(df) != nrow(.data)) { : argumento tiene longitud cero"

repeat {
  # 每次重试前重置所有采集相关变量
  linkToStopAt = as.character(unique(currentData$linkURL)[1])
  myLinksToSearchOver = as.character(unique(currentData$page))
  tmp = NULL
  i <- 1
  out_lst = list()
  
  # 用try包裹整个采集循环,捕获执行过程中的错误
  capture_error <- try({
    while(i <= length(myLinksToSearchOver)){
      print(paste("Processing page: ", i))
      # 可选:对单页采集单独做错误捕获,避免404等单页错误中断整个循环
      tmp_page <- try(possible_collectPageData(myLinksToSearchOver[i]), silent = TRUE)
      if(inherits(tmp_page, "try-error")){
        print(paste("Page", i, "collection failed, skipping"))
        i <- i + 1
        next
      }
      tmp <- tmp_page %>% add_column(page = myLinksToSearchOver[i])
      
      if(linkToStopAt %in% tmp$linkURL){
        print(paste("We stopped at: ", i))
        break
      }
      out_lst[[i]] <- tmp
      i <- i + 1
    }
  }, silent = TRUE)
  
  # 判断执行状态:无错误或错误非目标类型时,跳出重试循环
  if(!inherits(capture_error, "try-error") || !grepl(target_error, capture_error)){
    break
  }
  
  # 触发目标错误时,打印提示并重新执行采集循环
  print("Encountered target error, restarting collection...")
}

关键逻辑说明:

  • 变量重置:每次进入repeat循环都会重新初始化所有采集变量,确保每次重试都是从头开始执行
  • 双层错误捕获:
    1. 外层try捕获整个while循环的执行错误,重点监测目标特定报错
    2. 内层对possible_collectPageData单独加try,可处理404这类单页采集失败问题,避免单个页面出错导致整个流程中断(不需要跳过单页的话可删除此部分)
  • 精准重试触发:通过grepl匹配特定错误信息,确保只有触发目标错误时才会重试,正常完成或其他错误则直接退出循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:27:13