-
Notifications
You must be signed in to change notification settings - Fork 340
Closed
Description
I haven't been able to get this more minimal than the following; I don't understand well what's gone wrong:
foo <- function(formula, timeout = Inf) {
bar <- function() {
R.utils::withTimeout(
{Sys.sleep(2 * timeout); lm(formula, iris)},
timeout = timeout,
onTimeout = "error"
)
}
bar()
}
expect_error(foo(Sepal.Length ~ Sepal.Width, timeout = 1), "elapsed")
# Error in .subset2(cnd, "rlang") : subscript out of boundsThe traceback is:
19: cnd_some(cnd, function(x) !is_null(x[["trace"]]))
18: cnd_entrace(cnd)
17: (function (cnd)
{
if (!is.null(matched) || !matches(cnd)) {
return()
}
if (can_entrace(cnd)) {
cnd <- cnd_entrace(cnd)
}
matched <<- cnd
if (inherits(cnd, "message") || inherits(cnd, "warning")) {
cnd_muffle(cnd)
}
else if (inherits(cnd, "error") || inherits(cnd, "skip")) {
return_from(tl, cnd)
}
})(structure(NA, .env = <environment>, class = c("TimeoutException",
"Exception", "simpleError", "error", "condition", "try-error",
"Object")))
16: signalCondition(this)
15: throw.Exception(ex)
14: throw(ex)
13: value[[3L]](cond)
12: tryCatchOne(expr, names, parentenv, handlers[[1L]])
11: tryCatchList(expr, classes, parentenv, handlers)
10: tryCatch({
eval(expr, envir = envir, enclos = baseenv())
}, error = function(ex) {
msg <- ex$message
pattern <- gettext("reached elapsed time limit", "reached CPU time limit",
domain = "R")
pattern <- paste(pattern, collapse = "|")
if (regexpr(pattern, msg) != -1L) {
ex <- TimeoutException(msg, cpu = cpu, elapsed = elapsed)
if (onTimeout == "error") {
throw(ex)
}
else if (onTimeout == "warning") {
warning(getMessage(ex))
NULL
}
else if (onTimeout == "silent") {
NULL
}
}
else {
throw(ex)
}
})
9: R.utils::withTimeout({
Sys.sleep(2 * timeout)
lm(formula, iris)
}, timeout = timeout, onTimeout = "error") at #3
8: bar() at #9
7: foo(Sepal.Length ~ Sepal.Width, timeout = 1)
6: eval_bare(quo_get_expr(.quo), quo_get_env(.quo))
5: withCallingHandlers(expr, condition = function(cnd) {
if (!is.null(matched) || !matches(cnd)) {
return()
}
if (can_entrace(cnd)) {
cnd <- cnd_entrace(cnd)
}
matched <<- cnd
if (inherits(cnd, "message") || inherits(cnd, "warning")) {
cnd_muffle(cnd)
}
else if (inherits(cnd, "error") || inherits(cnd, "skip")) {
return_from(tl, cnd)
}
})
4: .capture(act$val <- eval_bare(quo_get_expr(.quo), quo_get_env(.quo)),
...)
3: quasi_capture(enquo(object), label, capture_matching_condition,
matches = matcher)
2: expect_condition_matching("error", {
{
object
}
}, regexp = regexp, class = class, ..., inherit = inherit, info = info,
label = label)
1: expect_error(foo(Sepal.Length ~ Sepal.Width, timeout = 1), "elapsed")
cnd in rlang:::cnd_some() is:
trace(rlang:::cnd_some, at=1, quote(message(toString(class(cnd)))))
expect_error(foo(Sepal.Length ~ Sepal.Width, timeout = 1), "elapsed")
# TimeoutException, Exception, simpleError, error, condition, try-error, Object
untrace(rlang:::cnd_some)The same comes from trying to catch the exception class directly instead:
expect_condition(foo(Sepal.Length ~ Sepal.Width, timeout = 1), class = "TimeoutException")
# Error in .subset2(cnd, "rlang") : subscript out of boundsFor now, I'm directly using tryCatch() as a workaroud:
expect_true(tryCatch(foo(Sepal.Length ~ Sepal.Width, timeout = 1), TimeoutException = \(e) TRUE))Metadata
Metadata
Assignees
Labels
No labels