如何用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循环都会重新初始化所有采集变量,确保每次重试都是从头开始执行 - 双层错误捕获:
- 外层
try捕获整个while循环的执行错误,重点监测目标特定报错 - 内层对
possible_collectPageData单独加try,可处理404这类单页采集失败问题,避免单个页面出错导致整个流程中断(不需要跳过单页的话可删除此部分)
- 外层
- 精准重试触发:通过
grepl匹配特定错误信息,确保只有触发目标错误时才会重试,正常完成或其他错误则直接退出循环
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

