5

我正在为 R 函数编写一个测试用例,该用例测试是否在函数中的某个点正确地抛出和捕获了错误,并且当在 withCallingHandlers 执行期间抛出错误时,我在继续测试时遇到了一些麻烦(...)。我正在使用这种方法:

counter <- 0
withCallingHandlers({
testingFunction(df0, df1)
testingFunction(df2, df3)
testingFunction(df4, df5)

}, warning=function(war){
    print(paste(war$message))
}, error=function(err){
    print(paste(err$message))
    if(err$message == paste("The function should throw this error message",
                              "at the right time.")){
        counter <<- counter + 1
    }

})

stopifnot(counter == 2)

我遇到的问题是脚本在(成功)捕获第一个错误后退出,我不确定如何处理错误,以便在捕获错误后,withCallingHandlers 只是继续执行下一部分。我知道它与重启对象有关,但我不确定如何正确使用它们。有谁知道我可以如何操作上面的代码,以便 withCallingHandlers(...) 的执行即使在捕获错误时也能继续?

4

2 回答 2

6

对于测试功能

fun1 = function() stop("something specific went wrong")

成语

obs = tryCatch(fun1(), error=conditionMessage)
exp = "something specific went wrong"
stopifnot(identical(exp, obs))

可能是 Ryan 的更整洁的版本,并且像他一样避免了由于错误原因引发错误的不幸情况。相同的范例适用于警告

fun2 = function(x) as.integer(x)
obs = tryCatch(fun2(c("1", "two")), warning=conditionMessage)
stopifnot(identical("NAs introduced by coercion", obs))

并检查“干净”的评估

obs = tryCatch(fun2(c("1", "2")), warning=conditionMessage, 
          error=conditionMessage)
stopifnot(identical(1:2, obs))

这没关系,只要Sys.getlocale()是“C”或其他不会改变条件消息翻译的编码。

于 2013-05-21T23:39:19.807 回答
4

您可以将每个调用包装为testingFunction对 . 的调用tryCatch

counter <- 0
testForExpectedError <- function(expr) {
    tryCatch(expr, error=function(err) {
        print(paste(err$message))
        if(err$message == paste("The function should throw this error message",
                                "at the right time.")){
            counter <<- counter + 1
        }
    })
}

testForExpectedError(testingFunction(df0, df1))
testForExpectedError(testingFunction(df2, df3))
testForExpectedError(testingFunction(df4, df5))

stopifnot(counter == 2)
于 2013-05-21T22:42:32.753 回答