【发布时间】:2018-12-23 08:00:45
【问题描述】:
在 R 中有一个名为tryCatch() 的函数可以从错误中恢复。我只见过写成函数的错误处理步骤。例如,添加error=function(e){0} 将在出错时返回零值。有没有更简单的方法来定义tryCatch() 而不必将错误写为函数?如果不是,那为什么?
我更喜欢这样的语法和结果:
x <- tryCatch(sqrt("a"), 0)
#> x
#> [1] 0
您可以编写自己的 tryCatch() 包装函数(下面的示例),但我想知道现有包中是否已经有另一个函数或者我在 tryCatch() 文档中缺少的东西使这成为可能。
解决方案写成包装函数:
iferror <- function(expr, error_expr){
tryCatch(expr, error=function(e){error_expr})
}
x <- iferror(sqrt("a"), 0)
#> x
#> [1] 0
注意:这不是如何使用tryCatch()的问题,而是如何使其语法不那么冗长的问题。
【问题讨论】:
-
tryCatch也会捕获警告。如果您想要一个特殊情况,您是否希望忽略该功能?这个怎么样:f0 <- function(e) 0,然后是tryCatch(expr, error=f0)。这并没有节省多少,但至少您对tryCatch的调用不那么混乱了。 -
我知道
tryCatch()处理警告和finally表达式,但在这里并不关心。在您的示例中,错误仍被定义为函数。这似乎不必要地冗长,但也许这正是您必须使用tryCatch()的方式 -
好的,
purrr::possibly(sqrt,0)('a')怎么样。由于possibly返回一个包装函数,你需要调用它,然后使用return再次调用,所以有点晦涩,我承认。
标签: r error-handling try-catch