[R] Stack trace?

William Dunlap wdunlap at tibco.com
Fri Nov 11 01:20:01 CET 2011


You asked
> Will traceback() work in the error routine specified in tryCatch?

No, for two reasons.

First, R's traceback(), unlike S+'s in certain circumstances,
does not create the stack trace.  It just prints it, based on
the value of some structure that the standard error processor creates.
You need to call sys.calls() (and perhaps sys.frames()) to get the current
stack information.

Second, tryCatch's error handler only gets called after the
error has been thrown, after the stack has been torn down.
The argument to the handler, e, contains only the error message
and the call that caused the error (use conditionMessage(e) and
conditionCall(e) to extract those things).  At that point, sys.calls()
doesn't say anything about what was happening when the error was about
to be thrown.  Perhaps there is some way to attach the whole call
stack or all the call frames to the condition passed to the tryCatch's
condition handler, but I don't know it.

You can use withCallingHandlers instead, as with my example with warnings
yesterday.  E.g.,
  > f <- function(x) {
  +      f.inner <- function() x + "string"
  +      f.inner()
  +   }
  > withCallingHandlers(f(10), error=function(e)cat(conditionMessage(e), sapply(sys.calls(),function(sc)deparse(sc)[1]), sep="\n   "))
  non-numeric argument to binary operator
     withCallingHandlers(f(10), error = function(e) cat(conditionMessage(e), 
     f(10)
     f.inner()
     .handleSimpleError(function (e) 
     h(simpleError(msg, call))
  Error in x + "string" : non-numeric argument to binary operator
I think it is easier to use options("error") for this sort of thing.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 

> -----Original Message-----
> From: Kevin Burton [mailto:rkevinburton at charter.net]
> Sent: Thursday, November 10, 2011 7:11 AM
> To: William Dunlap; 'Thomas Lumley'
> Cc: 'r-help'
> Subject: RE: [R] Stack trace?
> 
> Will traceback() work in the error routine specified in tryCatch?
> 
> error <- function(e)
> {
>     traceback()
> }
> 
> tryCatch(..., error=error)
> 
> -----Original Message-----
> From: William Dunlap [mailto:wdunlap at tibco.com]
> Sent: Wednesday, November 09, 2011 5:09 PM
> To: Thomas Lumley; rkevinburton at charter.net
> Cc: r-help
> Subject: RE: [R] Stack trace?
> 
> > -----Original Message-----
> > From: r-help-bounces at r-project.org
> > [mailto:r-help-bounces at r-project.org] On Behalf Of Thomas Lumley
> > Sent: Wednesday, November 09, 2011 1:53 PM
> > To: rkevinburton at charter.net
> > Cc: r-help
> > Subject: Re: [R] Stack trace?
> >
> > On Thu, Nov 10, 2011 at 10:35 AM,  <rkevinburton at charter.net> wrote:
> > >
> > > Currently I have a for loop executing functions and at the end I get
> > > a message like:
> > >
> > > There were 50 or more warnings (use warnings() to see the first 50)
> > >
> > > If I do what it says and type warnings(), I get 50 messages like:
> > >
> > > 2: In !is.na(x) & !is.na(rowSums(xreg)) :
> > >   longer object length is not a multiple of shorter object length
> > >
> > > I am not sure what function these errors are originating from. I
> > > don't think it is from any of the 'R' script that I wrote. I would
> > > like to see which function is being called when this error is thrown
> > > and which called that . . . and so on.
> > >
> > > I have the same problem with error messages. An error is thrown but
> > > I don't have a call stack to help trace down the problem. Is there
> > > some function or technique that I could use to help get a call stack?
> >
> > traceback() gets you a stack trace at the last error
> >
> > options(warn=2) makes warnings into errors
> >
> > options(error=recover) starts the post-mortem debugger at any error,
> > allowing you to inspect the stack interactively.
> 
> And
>   options(warning.expression=quote(recover()))
> will start that same debugger at each warning.
> 
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
> 
> 
> >   -thomas
> >
> > --
> > Thomas Lumley
> > Professor of Biostatistics
> > University of Auckland
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide
> > http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list