【问题标题】:Writing a Simpler Version of tryCatch in R在 R 中编写更简单的 tryCatch 版本
【发布时间】: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 &lt;- function(e) 0,然后是tryCatch(expr, error=f0)。这并没有节省多少,但至少您对tryCatch 的调用不那么混乱了。
  • 我知道tryCatch() 处理警告和finally 表达式,但在这里并不关心。在您的示例中,错误仍被定义为函数。这似乎不必要地冗长,但也许这正是您必须使用tryCatch() 的方式
  • 好的,purrr::possibly(sqrt,0)('a') 怎么样。由于possibly返回一个包装函数,你需要调用它,然后使用return再次调用,所以有点晦涩,我承认。

标签: r error-handling try-catch


【解决方案1】:

一种可能的解决方案是使用 testit 包中的has_error() 函数。虽然 CRAN 版本不允许控制错误消息的抑制。

示例

ifelse(testit::has_error(sqrt("a")), 0)
#> Error in sqrt("a") : non-numeric argument to mathematical function
#> [1] 0

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多