通过tryCatch块

时间:2016-10-06 11:43:50

标签: r

我正在开展网络抓取项目,由于各种原因导致产生大量错误。我正在使用tryCatch块来帮助识别和记录这些错误。

我想获取生成错误的函数的名称,而不必将其作为参数发送到每个tryCatch块中。

这是一个基本模板:

a <- function(x) {
  result <- tryCatch({

    if(x != 1) 
      warning('This is not 1!')
    return(x)

  }, warning = function(cond) {
    write_issues(cond, match.call()[[1]], type = 'warning')
    return(NULL)
  }, error = function(cond) {
    write_issues(cond, match.call()[[1]], type = 'error')
    return(NA)
  })

  return(result)

}

write_issues <- function(cond, fctn, type) {
  if(type == 'warning') {
    message(paste0('Function: ', fctn))
  } else if (type == 'error') {
    message(paste0('Function: ', fctn))
  }
}

a(2)

我想将fctn中的write_issues()设置为'a'。

当我得到write_issues时,使用match.call,fctn参数的值总是类似'value [[3]]'。我发现这是因为此时它引用了一个处理函数(我相信)。

我在write_issues()尝试了这个:

f <- deparse(sys.calls()[[3]])

在测试期间,似乎这会起作用但我现在发现它不一致。

这是我作为参数传递给write_issues()的东西,还是有什么办法可以一直抓住我写的产生错误的函数?

1 个答案:

答案 0 :(得分:0)

传递参数可能是最干净的,但如果由于某种原因这不是一个选项,您可以分析堆栈跟踪。最好避免在堆栈跟踪中查看固定偏移量,例如因为可能的编译器优化或检测:

funname <- function() {
  foundTC <- FALSE
  for(call in rev(sys.calls()))
    if (foundTC) return(call)
    else if (identical(call[[1]], quote(tryCatch))) foundTC <- TRUE
  NULL  
}

这个hack回顾第一次调用tryCatch之后的第一个函数。如果仪器插入了另一个tryCatch,它将失败。