Как следует обрабатывать ошибки?
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 долларов в месяц, что дает вам неограниченный доступ к тысячам руководств и статей по науке о данных. Если вы зарегистрируетесь по моей ссылке, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.