Как узнать в обработчике выхода trace (), если исключение было вызвано функцией

#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)
}