R tryCatch() - 最后引用 expr() 的 return?

R tryCatch() - referencing return of expr() in finally?

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

有没有办法从 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)
}

如果tryCatch return 值被保存到变量中,例如

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

这取决于 return 值的设置是否正确。如果执行过程中某处出错,那么……显然将没有可检索的值。

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

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

It specifies a block of code (not a function) to run regardless of whether the initial expression succeeds or fails. This can be useful for clean up (e.g., deleting files, closing connections). This is functionally equivalent to using on.exit() but it can wrap smaller chunks of code than an entire function.