错误时再次循环

ces*_*sco 3 r google-bigquery

我试着阅读所有内容,但我有点陷入一个问题.通过使用bigrquery,我创建了对Google BigQuery的查询以获取数据 - 遗憾的是,由于超时,我的查询有时无效.Q是一个SQL查询,BQ应该存储从BigQuery下载的数据.

每次tryCatch给我一个错误时,有没有人知道如何重新循环?

我到目前为止得到了这个:

BQ_Foo <- NULL
tryCatch(
{ 
repeat{
  BQ_Foo <- query_exec(Q_foo,"bigquery")
  if(is.list(BQ_Foo) == TRUE)break }
}
,error=function(e){cat("ERROR : Query not loaded!", "\n")}
)
Run Code Online (Sandbox Code Playgroud)

编辑:

我再次尝试了我的第一种方法,这次我收到了这条错误消息:

curl :: curl_fetch_memory(url,handle = handle)出错:
应用程序回调中止了操作

有谁知道如何处理这个?

Ten*_*bai 7

广泛基于r2evans的回答,这里是如何做同样的事情withRestarts,有一些帮助来自这篇博文:

set.seed(2)
foo <- NULL
operation <- function(x,tries) {
  message(paste("x is",x,"remaining tries",tries))
  withRestarts(
    tryCatch({
      if (runif(1) < x) stop("fail!") else 1
    },
    error=function(e) { invokeRestart("retry")}),
    retry = function() { 
      message("Retrying")
      stopifnot(tries > 0)
      operation(x,tries-1)
    }
  )
}
> operation(0.9,5)
# x is 0.9 remaining tries 5
# Retrying
# x is 0.9 remaining tries 4
# Retrying
# x is 0.9 remaining tries 3
# Retrying
# x is 0.9 remaining tries 2
# Retrying
# x is 0.9 remaining tries 1
[1] 1
Run Code Online (Sandbox Code Playgroud)

这是一种递归调用,因此您可以在再次调用函数之前执行任何操作.

您可以在tryCatch错误处理程序中以相同的方式执行此操作,使用重新启动处理程序的兴趣是调用特定的函数,如果您有两个tryCatch,您想要几乎相同的处理程序行为,那么您可以添加参数并使用相同的处理程序每次尝试捕获,即:

testfun <- function(x) {
  withRestarts({
    tryCatch(
      {
        ifelse(runif(1) < 0.5,stop("Error Message"),warning("Warning message"))
      },
      warning=function(e) { invokeRestart("logger", level="warning", message=e ) },
      error=function(e) { invokeRestart("logger", level="error", message=e ) } 
    )
    },
    logger = function(level,message) {
      message(date()," [",level,"]: ",message[['message']])
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

赠送:

> set.seed(2)
> testfun()
Fri Jul 29 14:15:11 2016 [error]: Error Message
> testfun()
Fri Jul 29 14:15:12 2016 [warning]: Warning message
> testfun()
Fri Jul 29 14:15:13 2016 [warning]: Warning message
> testfun()
Fri Jul 29 14:15:13 2016 [error]: Error Message
Run Code Online (Sandbox Code Playgroud)

这里的主要兴趣是记录器方法的分解和减少代码重复.