futureverse / futureverse/future
Capture and relay call frames on errors
- 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
Assessment
This issue has not been assessed yet.