Skip to content

Capture and relay call frames on errors #478

@HenrikBengtsson

Description

@HenrikBengtsson

Idea

> options(error = function() utils::recover())
> foo <- function(x, a = 2) a * x
> f <- future(foo("y"))
> v <- value(f)
Error in a * x : non-numeric argument to binary operator
Enter a frame number, or 0 to exit   
1: foo("y")
2: HenrikBengtsson/future-ideas#1: (function () 
utils::recover())()

Selection: 1
Called from: top level 
Browse[1]> ls.str()
a :  num 2
x :  chr "y"
Browse[1]> 

The idea is to have the future record the full recover stack in the FutureResult object. Something like the info in:

tb <- .traceback(NULL)
if (is.null(tb)) tb <- .traceback(2L)
utils::dump.frames(dumpto = "frames", to.file = FALSE)

and then regenerate this call stack when relaying the error on the parent R process. I'm not sure if/not the latter can be done, but if we can figure it out, it'll be super cool.

It might be expensive to transfer all call stacks back from the worker to the main R session when running in parallel, so maybe this needs to be enabled via an option, e.g. options(future.recover.enable = TRUE). It might be that we can enable it by default for sequential futures.

See also

#253

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions