【发布时间】:2021-05-11 00:04:11
【问题描述】:
我想重新尝试使用tryCatch 获取失败的readLines。只要我不将其包装在 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 内部工作?
【问题讨论】:
-
正如我在下面的回答中所解释的,在这里使用
message(cond)是不正确的。输出错误信息的正确方法是使用message(conditionMessage(cond))。