Как следует обрабатывать ошибки?

tryCatch имеет немного сложную синтаксическую структуру. Однако, как только мы поймем 4 части, которые составляют полный вызов tryCatch, как показано ниже, становится легко запомнить:

expr: [Обязательно] R-коды для оценки

ошибка : [Необязательно] Что должно выполняться, если произошла ошибка при оценке кодов в выражении

предупреждение : [Необязательно] Что должно выполняться, если при оценке кодов в выражении появилось предупреждение

finally : [Необязательно] Что должно выполняться непосредственно перед выходом из вызова tryCatch, независимо от того, было ли выражение expr выполнено успешно, с ошибкой или с предупреждением.

beera <- function(expr){
  tryCatch(expr,
           error = function(e){
             message("An error occurred:\n", e)
           },
           warning = function(w){
             message("A warning occured:\n", w)
           },
           finally = {
             message("Finally done!")
           })
}

Пример:

beera({
  2 + 2
})
Finally done!
[1] 4
beera({
  "two" + 2
})
An error occurred:
Error in "two" + 2: non-numeric argument to binary operator
Finally done!
beera({
  as.numeric(c(1, "two", 3))
})
A warning occured:
simpleWarning in doTryCatch(return(expr), name, parentenv, handler): NAs introduced by coercion
Finally done!

Создание ошибок

В R есть несколько важных функций для генерации ошибок, предупреждений и сообщений. Функция stop() генерирует ошибку. Сгенерируем ошибку:

stop("Something erroneous has occurred!")
Error: Something erroneous has occurred!

Функция stopifnot() принимает ряд логических выражений в качестве аргументов, и если какое-либо из них ложно, генерируется ошибка, указывающая, какое выражение ложно. Давайте посмотрим на пример:

error_if_n_is_greater_than_zero <- function(n){
  stopifnot(n <= 0)
  n
}

error_if_n_is_greater_than_zero(5)
Error in error_if_n_is_greater_than_zero(5): n <= 0 is not TRUE

Функция warning() создает предупреждение, а сама функция очень похожа на функцию stop(). Помните, что предупреждение не останавливает выполнение программы (в отличие от ошибки).

warning("Consider yourself warned!")
Warning: Consider yourself warned!

Сообщения проще, чем ошибки или предупреждения; они просто выводят строки на консоль R. Вы можете отправить сообщение с помощью функции message():

message("In a bottle.")
In a bottle.

Сводка

Ошибки, предупреждения и сообщения могут генерироваться в коде R с помощью функций stop, stopifnot, warning и message.

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

Если вам нравится читать такие истории и вы хотите поддержать меня как писателя, подумайте о том, чтобы зарегистрироваться и стать участником Medium. Это 5 долларов в месяц, что дает вам неограниченный доступ к тысячам руководств и статей по науке о данных. Если вы зарегистрируетесь по моей ссылке, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.