R tryCatch 与 testthat 期望
R tryCatch with testthat expectation
我有以下功能:
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 中被发现。
有没有办法让 R 3.3.0 中的 testthat
达到 tryCatch()
的预期?
我在 expect()
上设置了调试器,然后逐步执行了几行代码(为简洁起见编辑了输出),并查看了 class 发出信号的条件
> debug(expect)
> xx = expect_true(FALSE)
...
Browse[2]> n
debug: exp <- as.expectation(exp, ..., srcref = srcref)
Browse[2]>
...
Browse[2]> class(exp)
[1] "expectation_failure" "expectation" "condition"
Browse[2]> Q
> undebug(expect)
所以不是class'error'的条件,可以显式捕获
> tryCatch(expect_true(FALSE), expectation_failure=conditionMessage)
[1] "FALSE isn't true.\n"
您还可以赶上 expectation
class.
重新启动允许您继续,如果这在某种程度上很重要的话。
result <- withCallingHandlers({
expect_true(FALSE)
expect_true(!TRUE)
expect_true("this sentence")
}, expectation_failure=function(e) {
cat(conditionMessage(e))
invokeRestart("continue_test")
})
有输出
FALSE isn't true.
!TRUE isn't true.
"this sentence" isn't true.
> result
[1] FALSE
也可以捕获或处理成功
> tryCatch(expect_true(TRUE), expectation_success=class)
[1] "expectation_success" "expectation" "condition"
我有以下功能:
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 中被发现。
有没有办法让 R 3.3.0 中的 testthat
达到 tryCatch()
的预期?
我在 expect()
上设置了调试器,然后逐步执行了几行代码(为简洁起见编辑了输出),并查看了 class 发出信号的条件
> debug(expect)
> xx = expect_true(FALSE)
...
Browse[2]> n
debug: exp <- as.expectation(exp, ..., srcref = srcref)
Browse[2]>
...
Browse[2]> class(exp)
[1] "expectation_failure" "expectation" "condition"
Browse[2]> Q
> undebug(expect)
所以不是class'error'的条件,可以显式捕获
> tryCatch(expect_true(FALSE), expectation_failure=conditionMessage)
[1] "FALSE isn't true.\n"
您还可以赶上 expectation
class.
重新启动允许您继续,如果这在某种程度上很重要的话。
result <- withCallingHandlers({
expect_true(FALSE)
expect_true(!TRUE)
expect_true("this sentence")
}, expectation_failure=function(e) {
cat(conditionMessage(e))
invokeRestart("continue_test")
})
有输出
FALSE isn't true.
!TRUE isn't true.
"this sentence" isn't true.
> result
[1] FALSE
也可以捕获或处理成功
> tryCatch(expect_true(TRUE), expectation_success=class)
[1] "expectation_success" "expectation" "condition"