Правильная обработка ошибок вложенных функций - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть функция 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(), перехватить сообщение об ошибке и вернуть NA в superFoo(). Что-то вроде:

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

Проблема в том, что у меня 9 функций foo() в superFoo(). Интересно, есть ли более эффективный способ программирования?

Другая альтернатива - purrr:safely(). Это, однако, столь же многословно, как tryCatch(), потому что мне нужно переопределить foo() в superFoo(), прежде чем вызвать его:

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

Какова хорошая практика обработки ошибок во вложенных функциях?

1 Ответ

0 голосов
/ 05 сентября 2018

Если у вас один и тот же ответ на любой из 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")

и это будет поймано так же, как и другие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...