我正在开展网络抓取项目,由于各种原因导致产生大量错误。我正在使用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()
的东西,还是有什么办法可以一直抓住我写的产生错误的函数?
答案 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,它将失败。