#r
#r
Вопрос:
Есть ли способ узнать в trace()
exit
обработчике, вызвала ли функция необработанное исключение? В настоящее время я использую geterrmessage()
, но он улавливает обработанные исключения во внутренних компонентах других библиотек, что мне не нужно.
other_silent <- function() try(stop("irrelevant", call. = FALSE), silent = TRUE)
other_error <- function() stop("relevant", call. = FALSE)
my_silent <- function() other_silent()
my_error <- function() other_error()
trace(c("my_silent", "my_error"), print = FALSE,
tracer = quote({.Internal(seterrmessage(""))}),
exit = quote({print(geterrmessage())}))
my_silent()
my_error()
Вызов my_silent()
выдает вывод:
[1] "Error : irrelevantn"
Пока мне нужно, чтобы он молчал, потому что сама функция завершилась успешно.
Ответ №1:
В итоге я реализовал свою собственную версию трассировки, используя код из methods
as basis.
mytrace <- function(what) {
where <- environment(sys.function())
def <- getFunction(what, where = where)
body(def, envir = environment(def)) <- rlang::expr({
exception <- NA
tryCatch(!!body(def), error = function(e) {
exception <<- e
stop(e)
}, finally = {<log method with or without exception>})
})
assign(what, def, where)
}