如何在 R 中执行 ignore/skip 异常?

How to ignore/skip exceptions executed in R?

我已经尝试了在这里和其他地方找到的多个示例,但它总是无法满足我的要求。

我的 R 脚本只是一个配置验证脚本,它会检查以确保用户的环境设置正确。所以我想尝试 5 个不同的步骤并报告每个步骤的状态,以便用户可以立即修复所有问题。例如,我的第一步测试与数据库的连接,如果失败我想打印一条消息并继续执行第 2 步。但是当它出错时它总是停止执行所以我只遇到失败然后就没有了.

我是 运行 在 W64 上使用 RScript.exe 的命令行脚本。这是我的基本 tryCatch,我用错误函数尝试过,没有,没有区别,它总是在错误时中断。

tryCatch(
    expr = {
       res<- dbGetQuery(con, sql)
       print("SQL query results:")
       print(res)
    }
)

您根本没有在错误发生时进行处理。这里有一个 reprex 来展示如何在错误发生时捕获它:

function_that_always_fails <- function() stop("I failed")

exception_catcher <- function(e) "Carry on regardless"

tryCatch(expr  = function_that_always_fails())
#> Error in function_that_always_fails(): I failed

tryCatch(expr  = function_that_always_fails(),
         error = exception_catcher)
#> [1] "Carry on regardless"

或者,如果您想 运行 像您的示例中那样按顺序进行一系列测试,您可以使用如下内容:

function_that_sometimes_fails <- function(x)
{
  if(x %% 2 == 0) stop("function ", x, " failed")
  print(paste("test", x, "passed"))
}

exception_catcher <- function(e) print(paste(e$message, "but never mind"))

do_tests <- function() {
  for(i in 1:5)
    tryCatch(expr  = function_that_sometimes_fails(i),
         error = exception_catcher)
}

do_tests()
#> [1] "test 1 passed"
#> [1] "function 2 failed but never mind"
#> [1] "test 3 passed"
#> [1] "function 4 failed but never mind"
#> [1] "test 5 passed"

reprex package (v0.3.0)

于 2020-08-17 创建

tryCatch 在您告诉它您想要捕获的内容之前什么也不会捕获。例如,

tryCatch(
    expr = {
       res<- dbGetQuery(con, sql)
       print("SQL query results:")
       print(res)
    },
    error = function(e) NULL
)

出现错误时会returnNULL。没有那条线,它什么也抓不到。

旁注:res 的存在不确定。两种情况:

  1. res 以前从未定义过。如果出现错误,res 将不存在,并且其后的任何代码都将失败并显示 Error: object 'res' not found.

  2. res 是在之前的代码块中定义的,现在可能不需要了。但是,如果 dbGetQuery 失败,则 res 不会被重新定义,因此它仍然存在但与 this 查询无关。

两种情况都有问题。我推荐这样的东西:

res <- NULL
res <- tryCatch({
  dbGetQuery(con, sql)
}, error = function(e) conditionMessage(e))
if (is.null(res)) {
  print(paste("oops!", res))
} else {
  print(res)
}