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 [[alternative HTML version deleted]]
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:> 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 >[[alternative HTML version deleted]]
Thanks -- will look into it. luke On Fri, 1 Dec 2017, William Dunlap via R-devel wrote:> 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 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
This should now be resolved in R-devel and R_patched. Best, luke On Fri, 1 Dec 2017, luke-tierney at uiowa.edu wrote:> Thanks -- will look into it. > > luke > > On Fri, 1 Dec 2017, William Dunlap via R-devel wrote: > >> 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 >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > >-- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu