我有以下功能:
fun = function(expr) {
mc = match.call()
env = as.environment(within(
list(),
expr = eval(mc$expr)
))
return(env)
}
Run Code Online (Sandbox Code Playgroud)
在一个内部调用,tryCatch()以便expr优雅地处理任何错误条件.
它在标准错误条件下工作正常:
tryCatch({
fun({
stop('error')
})
}, error = function(e) {
message('error happened')
})
# error happened
Run Code Online (Sandbox Code Playgroud)
但是,它不会捕获testthat期望错误(这是我特定用例的首选):
library(testthat)
tryCatch({
fun({
expect_true(FALSE)
})
}, error = function(e) {
message('expectation not met')
})
# Error: FALSE isn't true.
Run Code Online (Sandbox Code Playgroud)
或更简单地说:
library(testthat)
tryCatch({
expect_true(FALSE)
}, error = function(e) {
message('expectation not met')
})
# Error: FALSE isn't true.
Run Code Online (Sandbox Code Playgroud)
期望错误未被捕获.
从R 3.2.2升级到R 3.3.0之后出现了这个问题 - 即期望错误在R 3.2.2中被捕获.
有没有办法让R 3.3.0中的testthat期望得到满足tryCatch()?
我设置调试器expect()然后逐步执行几行代码(为简洁起见编辑输出),并查看发出信号的条件的类
> 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)
Run Code Online (Sandbox Code Playgroud)
所以它不是类'错误'的条件,可以明确地捕获
> tryCatch(expect_true(FALSE), expectation_failure=conditionMessage)
[1] "FALSE isn't true.\n"
Run Code Online (Sandbox Code Playgroud)
你也可以expectation上课.
重启允许你继续,如果这是重要的.
result <- withCallingHandlers({
expect_true(FALSE)
expect_true(!TRUE)
expect_true("this sentence")
}, expectation_failure=function(e) {
cat(conditionMessage(e))
invokeRestart("continue_test")
})
Run Code Online (Sandbox Code Playgroud)
与输出
FALSE isn't true.
!TRUE isn't true.
"this sentence" isn't true.
> result
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
人们也可以抓住或处理成功
> tryCatch(expect_true(TRUE), expectation_success=class)
[1] "expectation_success" "expectation" "condition"
Run Code Online (Sandbox Code Playgroud)