Ключом к использованию tryCatch
является понимание того, что он возвращает объект. Если внутри tryCatch
произошла ошибка, этот объект будет наследоваться от класса error
. Вы можете проверить наследование класса с помощью функции inherit
.
x <- tryCatch(stop("Error"), error = function(e) e)
class(x)
"simpleError" "error" "condition"
Редактировать:
Что означает аргумент error = function(e) e
? Это сбило меня с толку, и я не думаю, что это хорошо объяснено в документации. Что происходит, так это то, что этот аргумент перехватывает любые сообщения об ошибках, которые возникают в выражении, которое вы tryCatch
ing. Если ошибка обнаружена, она возвращается как значение tryCatch
. В справочной документации это описано как calling handler
. Аргумент e
внутри error=function(e)
- это сообщение об ошибке, исходящее из вашего кода.
Я из старой школы процедурного программирования, где использование next
было плохой вещью. Поэтому я бы переписал ваш код примерно так. (Обратите внимание, что я удалил оператор next
внутри tryCatch
.):
for (i in 1:39487) {
#ERROR HANDLING
possibleError <- tryCatch(
thing(),
error=function(e) e
)
if(!inherits(possibleError, "error")){
#REAL WORK
useful(i); fun(i); good(i);
}
} #end for
Функция next
задокументирована внутри ?
for`.
Если вы хотите использовать его вместо основной рабочей подпрограммы внутри if
, ваш код должен выглядеть примерно так:
for (i in 1:39487) {
#ERROR HANDLING
possibleError <- tryCatch(
thing(),
error=function(e) e
)
if(inherits(possibleError, "error")) next
#REAL WORK
useful(i); fun(i); good(i);
} #end for