如何在 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
的存在不确定。两种情况:
res
以前从未定义过。如果出现错误,res
将不存在,并且其后的任何代码都将失败并显示 Error: object 'res' not found
.
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)
}
我已经尝试了在这里和其他地方找到的多个示例,但它总是无法满足我的要求。
我的 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
的存在不确定。两种情况:
res
以前从未定义过。如果出现错误,res
将不存在,并且其后的任何代码都将失败并显示Error: object 'res' not found
.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)
}