futureverse / futureverse/future

Capture and relay call frames on errors

Open
#478 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
R
Stars
1k
Forks
92
PR merge metrics
No merged PRs in 30d

Description

# Idea

```r
> 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:

```r
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

https://github.com/HenrikBengtsson/future/issues/253

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.