From wdunlap at tibco.com  Fri Dec  1 23:16:01 2017
From: wdunlap at tibco.com (William Dunlap)
Date: Fri, 1 Dec 2017 14:16:01 -0800
Subject: [Rd] tryCatch in on.exit()
In-Reply-To: <CAF8bMcYN35WtHdaYMV8NxL_B9o+dng6PbhqS=UgnYMPvYJy2ZA@mail.gmail.com>
References: <CAF8bMcYN35WtHdaYMV8NxL_B9o+dng6PbhqS=UgnYMPvYJy2ZA@mail.gmail.com>
Message-ID: <CAF8bMcZi52_++xMQ61YCgf_DEbNkh68+XnjXOEE8fhQLr0FFYw@mail.gmail.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:

> 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]]



[Rd] tryCatch in on.exit()
William Dunlap