r语言 - 正确处理嵌套函数的错误



我有一个函数superFoo()它调用其他函数foo()。每个foo()函数都有不同的输出,即列表、数据帧、标量。 我需要:

  1. 每当任何foo()失败时停止执行superFoo()(它表示错误或警告(
  2. 捕获错误消息。

    foo = function(a){
    log(a)
    }
    superFoo = function (a){
    varA = foo(a)
    # IF foo(a) fails, superFoo has to: stop and     return NA
    varB = foo(varA+3)
    varA + varB
    }
    # Iteration
    HyperY = setups %>% split(.$IDsample) %>% 
    map(superFoo)
    

我知道我可以在superFoo()内部执行tryCatch(),捕获错误消息并在superFoo()中返回NA。像这样:

varA = tryCatch({foo()}, error=(return(NULL)), warning(return(NULL)))
if (is.null(varA)) { return(list(NA, errorMessage)}

问题是我在superFoo()中有 9 个foo()函数。我想知道是否有更有效的编程方法。

另一种选择是purrr:safely().然而,这和tryCatch()一样啰嗦,因为我必须在superFoo()中重新声明foo(),然后才能调用它:

safeFoo = safely(foo)
varA = safeFoo(a)
if (is.null(varA)) { return(list(NA, errorMessage) }

嵌套函数中的错误处理的良好做法是什么?

如果您对 9 个函数调用中的任何一个都有相同的响应,那么您可以将整个superFoo体包装在一个tryCatch中,例如

superFoo = function (a){
tryCatch({
varA = foo(a)
# IF foo(a) fails, superFoo has to: stop and     return NA
varB = foo(varA+3)
varA + varB
}, error = return(NULL), warning = return(NULL))
}

这将跳过对is.null(varA)的单独检查。 如果需要,请添加一行,例如

if (is.null(varA)) stop("varA is NULL")

这将与其他错误一样被捕获。

最新更新