在R中为错误消息指定调用函数

时间:2018-09-24 15:38:25

标签: r error-handling

我正在研究一个R包,其中相同的输入检查功能由导出到用户的多个“实际”功能调用。如果我使用一个简单的stop()调用,则错误消息将表明输入检查功能中发生了错误,这不是那么有用...

我想我可以通过将对输入检查函数的调用包装在tryCatch()内,然后处理外部函数中的错误来解决此问题。这主要满足了我的要求,但是并没有给出我想要的输出。我最接近的是:

f <- function(i) {
    tryCatch({
        check_input(i)
    }, error = function(e) stop("in f: ", e$message, call. = FALSE)
    )
}

check_input <- function(i) {
    if(i < 0)
        stop("i is negative, value given was ", i)
}

f(-1)
# Error: in f: i is negative, value given was -1

理想情况下,我希望错误消息是

Error in f: i is negative, value given was -1

,如果在stop而不是f()中调用check_input(),情况就是这样。

1 个答案:

答案 0 :(得分:2)

这是从调用堆栈中获取函数名称并将其粘贴到错误消息中的方法

f <- function(i) {
  check_input(i)
}
g <- function(i) {
  check_input(i)
}

check_input <- function(i, from=deparse(sys.calls()[[sys.nframe()-1]][[1]])) {
  getmsg <- function(m) ifelse(!is.null(from), paste0("in ", from, ": ", m), m)
  if(i < 0)
    stop(getmsg(paste0("i is negative, value given was ", i)), call. = FALSE)
}

f(-1)
#  Error: in f: i is negative, value given was -1
g(-1)
#  Error: in g: i is negative, value given was -1

您还可以调用check_input(i, from="otherfunction")来显示所需的任何函数名称,或调用check_input(i, from=NULL)来隐藏函数名称。