I have a code that has an error because of not enough memory. Actually I do a linear model (lm) on a big data. The problem is not because it gives me the error, that I want to log, but because it contains value[[3L]](cond).
My error looks like this:
Error in value[[3L]](cond): While training model Error: cannot allocate vector of size 6.4 Gb
The code that logs it look like this (using logging lib):
tryCatch({
# some code
tryCatch({
# some other code
}, warning = function(war){
logwarn(war, logger = "MyLogger")
}, error = function(err){
stop(paste("While training model", err, sep = " "))
})
some more code
}, error = function(err){
logerror(err, logger = "MyLogger")
})
My problem is why is it saying Error in value[[3L]](cond):? Is it something wrong that I did and I do not know? Shouldn't it be just Error: <error message>?
You are issuing stop() in your inner tryCatch, and internally, when an error condition is raised, tryCatch() calls the error handler you provided which is the third element in a list (internal to tryCatch). It calls that that handler passing condition cond via: value[[3L]](cond). Since your error handler calls stop, that's where the most recent error was called.
You can use traceback() (which implicitly calls print()) to view the call stack in the error handler like so:
tryCatch({
stop('')
},error=function(err){
traceback()
})
which yields:
5: print(where) at #4
4: value[[3L]](cond)
3: tryCatchOne(expr, names, parentenv, handlers[[1L]])
2: tryCatchList(expr, classes, parentenv, handlers)
1: tryCatch({
stop()
}, error = function(err) {
print(where)
})
If you want to retain the call-stack from the original error but have a more informative error message, just edit the error and re-raise it :
tryCatch({
# some other code
}, warning = function(war){
logwarn(war, logger = "MyLogger")
}, error = function(err){
# edit the error message
err$message <- paste("While training model", err, sep = " ")
# and re-raise
stop(err)
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With