Run a block of code, collecting any deferrable_error
calls that occur. Ordinary errors will be thrown immediately.
defer_errors(expr, handler = stop)
expr | An expression to evaluate |
---|---|
handler | The final handler for the deferred errors. The
default is |
The error object will contain an element errors
with the
deferred errors, each of which will contain elements
message
, call
(the call that precedes
deferrable_error
and calls
which contains the
"interesting" part of the stack trace (i.e., only calls below the
defer_errors
infrastructure).
check_positive <- function(x) { if (x < 0) { deferrable_error(paste("got a negative number:", x)) } } err <- tryCatch( defer::defer_errors({ check_positive(0) check_positive(-1) check_positive(-2) }), error = identity) err#> <deferred_errors: 2 errors occured: #> - got a negative number: -1 #> - got a negative number: -2># Directly return the error: err <- defer::defer_errors({ check_positive(0) check_positive(-1) check_positive(-2) }, handler = return) # Stack traces are included to improve downstream reporting: f <- function(x) { g(x) } g <- function(x) { check_positive(x) } err <- defer_errors({ f(0) f(-1) f(-2) }, handler = return) err$errors[[1]]$calls#> [[1]] #> f(-1) #> #> [[2]] #> g(x) #> #> [[3]] #> check_positive(x) #> #> [[4]] #> deferrable_error(paste("got a negative number:", x)) #>