tryCatch does not catch an error if called though RScript
r, try-catch
Solution
The issue is in the way the internal C code implementing S4 method dispatch tries to catch and handle some errors and how the non-interactive case is treated in this approach. A work-around should be in place in R-devel and R-patched soon.
Work-around now committed to R-devel and R-patched.
Problem
I'm facing a strange issue in R. Consider the following code (a really simplified version of the real code but still having the problem) : ``` library(timeSeries) tryCatch( { specificWeekDay <- 2 currTs <- timeSeries(c(1,2),c('2012-01-01','2012-01-02'), format='%Y-%m-%d',units='A') # just 2 dates out of range start <- time(currTs)[2]+100*24*3600 end <- time(currTs)[2]+110*24*3600 # this line returns an empty timeSeries currTs <- window(currTs,start=start,end=end) message("Up to now, everything is OK") # this is the line with the uncatchable error currTs[!(as.POSIXlt(time(currTs))$wday %in% specificWeekDay),] <- NA message("I'm after the bugged line !") },error=function(e){message(e)}) message("End") ``` When I run that code in RGui, I correctly get the following output: Up to now, everything is OK error in evaluating the argument 'i' in selecting a method for function '[<-': Error in as.POSIXlt.numeric(time(currTs)) : 'origin' must be supplied End Instead, when I run it through RScript (in windows) using the following line: ``` RScript.exe --vanilla "myscript.R" ``` I get this output: Up to now, everything is OK Execution interrupted It seems like RScript crashes... Any idea about the reason? Is this a timeSeries package bug, or I'm doing something wrong ? If the latter, what's the right way to be sure to catch all the errors ? Thanks in advance. EDIT : Here's a smaller example reproducing the issue that doesn't use timeSeries package. To test it, just run it as described above: ``` library(methods) # define a generic function setGeneric("foo", function(x, ...){standardGeneric("foo")}) # set a method for the generic function setMethod("foo", signature("character"), function(x) {x}) tryCatch( { foo("abc") foo(notExisting) },error=function(e)print(e)) ``` It seems something related to generic method dispatching; when an argument of a method causes an error, the dispatcher cannot find the signature of the method and conseguently raises an exception that `tryCatch` function seems unable to handle when run through RScript. Strangely, it doesn't happen for example with `print(notExisting)`; in that case the exception is correctly handled. Any idea about the reason and how to catch this kind of errors ? Note: I'm using R-2.14.2 on Windows 7