正确处理嵌套函数的错误

问题描述 投票:0回答:1

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

  1. 每当superFoo()失败时停止执行foo()(它表示错误或警告)
  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)

我知道我可以在tryCatch()里面做superFoo(),捕获错误信息并在superFoo()中返回NA。就像是:

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

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

另一种选择是purrr:safely()。然而,这与tryCatch()一样冗长,因为我必须在foo()重新声明superFoo()之后再说:

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

嵌套函数中错误处理的一个好方法是什么?

r function debugging purrr
1个回答
0
投票

如果你对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")

这将被捕获与其他错误被捕获相同。

© www.soinside.com 2019 - 2024. All rights reserved.