У меня есть следующая функция:
fun = function(expr) {
mc = match.call()
env = as.environment(within(
list(),
expr = eval(mc$expr)
))
return(env)
}
который вызывается внутри tryCatch()
, так что любые ошибки в expr
обрабатываются корректно.
Он отлично работает со стандартным условием ошибки:
tryCatch({
fun({
stop('error')
})
}, error = function(e) {
message('error happened')
})
# error happened
Однако он не фиксирует testthat
ошибок ожидания (что предпочтительнее для моего конкретного варианта использования):
library(testthat)
tryCatch({
fun({
expect_true(FALSE)
})
}, error = function(e) {
message('expectation not met')
})
# Error: FALSE isn't true.
или проще:
library(testthat)
tryCatch({
expect_true(FALSE)
}, error = function(e) {
message('expectation not met')
})
# Error: FALSE isn't true.
Ошибка ожидания не обнаружена.
Эта проблема появилась после обновления с R 3.2.2 до R 3.3.0, т.е. ошибки ожидания были обнаружены только в R 3.2.2.
Есть ли способ сделать testthat
ожидания пойманными tryCatch()
в R 3.3.0?
expect_xxx
вызываютexpect
, который, в свою очередь, вызываетwithRestarts
. Я не знаю точно, что это делает, но, похоже, это корень проблемы, с которой вы столкнулись. - person Dason   schedule 17.06.2016