【问题标题】:Specify the calling function for an error message in R在 R 中指定错误消息的调用函数
【发布时间】:2018-09-24 15:38:25
【问题描述】:

我正在开发一个 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

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

【问题讨论】:

  • 将调用函数的名称传递给check_input 函数并在那里格式化错误消息可能会更容易。但是没有办法欺骗stop() 函数中的构建,以使用一个函数名称,而不是实际发生停止的函数。您需要自己格式化消息,
  • 谢谢@MrFlick,我自己只是在玩sys.call(),但错过了deparse()的使用。我将把它打开一段时间,但听起来它已经尽可能接近了。

标签: r error-handling


【解决方案1】:

以下是如何从调用堆栈中获取函数名称并将其粘贴到错误消息中

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) 来隐藏函数名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2018-06-26
    相关资源
    最近更新 更多