Skip to content

tryCatch in on.exit()

4 messages · William Dunlap, Luke Tierney

#
The following example involves a function whose on.exit()
expression both generates an error and catches the error.
The body of the function also generates an error.

When calling the function wrapped in a tryCatch, should
that tryCatch's error function be given the error from the
body of the function, since the one from the on.exit has
already been dealt with?  Currently the outer tryCatch gets
the error from the on.exit expression.

xx <- function() {
  on.exit(tryCatch(
    expr = stop("error in xx's on.exit"),
    error=function(e) {
      cat("xx's on.exit caught error: <<", conditionMessage(e), ">>\n",
sep="")
    }))
  stop("error in body of xx")
}
zz <- tryCatch(xx(), error=function(e)paste("outer tryCatch caught error
<<", conditionMessage(e), ">>", sep=""))
#xx's on.exit caught error: <<error in xx's on.exit>>
zz
#[1] "outer tryCatch caught error <<error in xx's on.exit>>"


Bill Dunlap
TIBCO Software
wdunlap tibco.com
#
Things work as I would expect if you give stop() a condition object instead
of a string:

makeError <- function(message, class = "simpleError", call = sys.call(-2)) {
    structure(list(message=message, call=call), class=c(class, "error",
"condition"))
}
f0 <- function() {
    on.exit(tryCatch(expr = stop("pb. in f0's on.exit"),
                     error = function(e)cat("[error] caught",
paste(collapse="/", class(e)), ":", conditionMessage(e), "\n")))
    stop("pb. in f0")
}
f1 <- function() {
    on.exit(tryCatch(expr = stop(makeError("pb. in f1's on.exit",
class="simpleError")),
                     error = function(e)cat("[error] caught",
paste(collapse="/", class(e)), ":", conditionMessage(e), "\n")))
    stop(makeError("pb. in f1", class="simpleError"))
}
catch <- function(FUN) {
    tryCatch(
        expr = FUN(),
        error = function(e)paste("[error] caught", paste(collapse="/",
class(e)), ":", conditionMessage(e)))
}
catch(f0) # calls stop("string")
#[error] caught simpleError/error/condition : pb. in f0's on.exit
#[1] "[error] caught simpleError/error/condition : pb. in f0's on.exit"
catch(f1) # calls stop(conditionObject)
#[error] caught simpleError/error/condition : pb. in f1's on.exit
#[1] "[error] caught simpleError/error/condition : pb. in f1"


Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Fri, Dec 1, 2017 at 12:58 PM, William Dunlap <wdunlap at tibco.com> wrote:

            

  
  
#
Thanks -- will look into it.

luke
On Fri, 1 Dec 2017, William Dunlap via R-devel wrote:

            

  
    
4 days later
#
This should now be resolved in R-devel and R_patched.

Best,

luke
On Fri, 1 Dec 2017, luke-tierney at uiowa.edu wrote: