Обращение с исключением и раскручивание стека в R

StackOverflow https://stackoverflow.com//questions/12672351

Вопрос

Чтобы настроить последовательный интерфейс обработки исключений для моих коллег и моих сценариев R, я хотел бы использовать следующую структуру Trycatch.

  1. внешняя попытка обернута вокруг данного r скрипт. Он используется для уловления и обрабатывания фатальных ошибок, требующих скрипта для прерывания.
  2. Успевающие пользовательские команды trycatch в сценариях пользователя. Они должны поймать и, возможно, ручка
      .
    • 2a. Нефатальные ошибки, где не требуется никаких скриптов аборт
    • 2b. Фатальные ошибки, которые требуют скрипта для прерваний. Ошибка обрабатывается внешним попечкой [см. 1]]
    • 2c. Фатальные ошибки с дополнительной информацией об ошибке. Ошибка обработана внешней попечкой.

      Следующий код - это то, как я бы реализую эти функции. Однако, поскольку я не являюсь экспертом в R, я бы хотел спросить, является ли это хорошим подходом. В частности:

      Q1. Это нормально не указать обработчик ошибок во внутреннем попечении и дождаться внешнего попечения для обработки этой ошибки (см. 2B. Выше и код ниже)?

      Q2. Представляет собой одну и ту же ошибку (см. 2с. Выше / ниже) внутри обработчика правильный / считается хорошим стилем кодирования?

      Спасибо!

      #outer tryCatch, see 1.
      tryCatch({
        #user code block
        #2a. user specific tryCatch, object "vec" not defined
        tryCatch(print(vec),error=function(e) {print("Non-fatal error. Script execution continued.");print(e);})
      
        #2b. user specific tryCatch
        tryCatch(vec*2)
      
        #2c. user specific tryCatch
        tryCatch(vec*parameter1, error=function(e) {print("Additional fatal error information. Script execution aborted.");stop(e);})
        #end of user code block
      },
           #outer tryCatch error handler in order to handle fatal errors
           error=function(e) {print("Fatal error");print(e);} 
          )
      
      .

Это было полезно?

Решение

Это совершенно нормально, чтобы поймать только некоторые ошибки, оставив других для наружного обработчика или обработчика вообще.Система ошибок довольно многое более гибкая, чем обычно используется, поэтому для повторного бросания ошибки вы можете подумать о создании собственного типа ошибки

ourError <-
    function(original, message, class="ourError")
{
    msg <- paste(message, conditionMessage(original), sep="\n  ")
    structure(list(message = msg, call = conditionCall(original)),
              class = c(class, class(original)))
}
.

и бросание и / или обработка, что

tryCatch(vec*parameter1, error=function(e) {
    err <- ourError(e, "addition fatal info; script aborted")
    stop(err)
})
.

Одним из преимуществ этого является то, что дополнительное поведение может быть указано в обработчике верхнего уровня, используя класс, возвращаемый ourError()

tryCatch({
    tryCatch(stop("oops"), error=function(e) {
        err <- ourError(e, "addition fatal info; script aborted",
                      c("fatal", "ourError"))
        stop(err)
    })
}, ourError=function(err) {
    message("We caught but didn't handle this:\n", err)
}, error =function(err) {
    message("This one got away: ", err)
})
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top