I've read a few other SO questions about tryCatch
and cuzzins, as well as the documentation:
- Exception handling in R
- catching an error and then branching logic
- How can I check whether a function call results in a warning?
- Problems with Plots in Loop
but I still don't understand.
I'm running a loop and want to skip to next
if any of a few kinds of errors occur:
for (i in 1:39487) {
# EXCEPTION HANDLING
this.could.go.wrong <- tryCatch(
attemptsomething(),
error=function(e) next
)
so.could.this <- tryCatch(
doesthisfail(),
error=function(e) next
)
catch.all.errors <- function() { this.could.go.wrong; so.could.this; }
catch.all.errors;
#REAL WORK
useful(i); fun(i); good(i);
} #end for
(by the way, there is no documentation for next
that I can find)
When I run this, R
honks:
Error in value[[3L]](cond) : no loop for break/next, jumping to top level
What basic point am I missing here? The tryCatch
's are clearly within the for
loop, so why doesn't R
know that?
The key to using
tryCatch
is realising that it returns an object. If there was an error inside thetryCatch
then this object will inherit from classerror
. You can test for class inheritance with the functioninherit
.Edit:
What is the meaning of the argument
error = function(e) e
? This baffled me, and I don't think it's well explained in the documentation. What happens is that this argument catches any error messages that originate in the expression that you aretryCatch
ing. If an error is caught, it gets returned as the value oftryCatch
. In the help documentation this is described as acalling handler
. The argumente
insideerror=function(e)
is the error message originating in your code.I come from the old school of procedural programming where using
next
was a bad thing. So I would rewrite your code something like this. (Note that I removed thenext
statement inside thetryCatch
.):The function
next
is documented inside?
for`.If you want to use that instead of having your main working routine inside an
if
, your code should look something like this:The only really detailed explanation I have seen can be found here: http://mazamascience.com/WorkingWithData/?p=912
Here is a code clip from that blog post showing how tryCatch works
One thing I was missing, which breaking out of for loop when running a function inside a for loop in R makes clear, is this:
next
doesn't work inside a function.Voldemort = TRUE
) from inside your function (in my casetryCatch
) to the outside.Voldemort == TRUE
). If so you callbreak
ornext
outside the function.