【问题标题】:R tryCatch() - referencing return of expr() in finally? [duplicate]R tryCatch() - 最后引用 expr() 的返回? [复制]
【发布时间】:2020-11-20 06:00:32
【问题描述】:

我正在尝试编写一个函数来处理批处理作业的执行, 记录错误和作业结果的统计信息。

有没有办法从 finally 块中引用 expr 块的返回值?

my_do <- function(FUN, ...){

  result <- tryCatch({
      FUN(...)
    }, 
    error = function(e) {
      message("error.")
    },
    finaly = {

      # how can I reference the returning value of FUN(...) in finally block?
      # so for example, I can write code like this:

      message(paste("Result dimensions:", dim(expr_result)))
    },
  )

  return(result)
}

【问题讨论】:

  • 如果FUN(...) 抛出错误,则没有返回值。我认为您可能对重新启动感兴趣,但您的示例既不完整/不可重现,也不够具体。
  • 感谢 Roland 的评论,是的,当我试图最小化我的原始代码时,我确实错过了一些使问题有点模糊的部分。最初我的代码有一个安全机制,可以在发生错误时返回替代数据帧。

标签: r try-catch-finally


【解决方案1】:

我建议这不是使用finally 的最佳方式。

使用finally (http://adv-r.had.co.nz/Exceptions-Debugging.html) 有以下最佳实践:

它指定要运行的代码块(不是函数)无论初始表达式是成功还是失败。这对于清理很有用(例如,删除文件、关闭连接)。这在功能上等同于使用 on.exit(),但它可以包装比整个函数更小的代码块。

【讨论】:

  • 感谢您向我介绍 Hadley 的精彩文章!将在那里进一步阅读。
【解决方案2】:

如果tryCatch返回值被保存到变量中,比如

x <- tryCatch({ 1; }, finally = { message("value is ", x); })
# Error in message("value is ", x) : object 'x' not found

那么答案是,因为tryCatch 执行finally=x 对象不存在。

但是,代码块在父环境中运行,因此您可以这样做:

tryCatch({ x <- 1; }, finally = { message("value is ", x); })
# value is 1
x
# [1] 1

这依赖于正确设置的返回值。如果在执行的某个地方出现错误,那么……显然将没有可检索的值。

【讨论】:

  • 感谢 Evans 明确表示,如果不将结果保存到对象,我无法引用 expr 块的输出!我错误地认为可能有一种方法可以以某种方式引用 expr 块的返回。我根据您的建议更改了我的原始代码,以使其按我的意愿工作。希望你有一个美好的一天!
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2013-06-06
  • 2014-07-21
  • 1970-01-01
  • 2013-08-21
  • 2017-12-03
  • 2016-06-17
相关资源
最近更新 更多