我想重新尝试readLines
使用tryCatch
. 只要我不将其包装在future.apply::future_lapply
处理列表或向量的调用中,这将按预期工作。
可以使用以下代码重现该问题:
read_lines_retrying <- function(url, attempts = 5, throttle = 5) {
result <- NA
while (is.na(result) && 0 < attempts) {
attempts <- attempts - 1
result <- tryCatch(
{
readLines(url)
},
error = function(cond) {
message("caught error:")
message(cond)
message("")
Sys.sleep(throttle)
return(NA)
}
)
}
if (is.na(result)) {
stop(paste("could not get URL ", url))
}
return(result)
}
urls <- c("http://nonexistant.nonexistant")
future.apply::future_lapply(urls, read_lines_retrying)
当然,代码是用来重试暂时readLines
失败的,而示例 URL 总是会失败,但这种方式最容易看出问题。使用lapply
代替 时future.apply::future_lapply
,至少需要 5 秒才能完成,因为它在 5 次尝试后等待 5 秒。情况并非如此future.apply::future_lapply
,表明异常处理不起作用。
我做错了什么,我怎么能tryCatch
在里面工作future.apply::future_lapply
?