当前位置: 首页 > 知识库问答 >
问题:

R tryCatch()-在finally中引用expr()的返回?[副本]

颛孙沈义
2023-03-14

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

是否有方法从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)
}

共有2个答案

闽涵蓄
2023-03-14

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

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

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

许天逸
2023-03-14

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

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

那么答案是否定的,因为当tryCatch执行最终=时,x对象不存在。

但是,代码块在父环境中运行,因此您可以执行以下操作:

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

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

 类似资料:
  • 问题内容: 近我很惊讶地发现,在Java的finally块中可能有一个return语句。 似乎很多人都认为这是一件坏事,如“ 不要在finally子句中返回”中所述。更深入地研究,我还发现“ Java的回报并不总是 ”,这在finally块中显示了其他类型的流控制的一些非常可怕的示例。 因此,我的问题是,谁能给我一个示例,其中finally块中的return语句(或其他流控制)产生更好/更具可读性

  • 问题内容: 这些天来我一直在学习Java,而我读到的才是真正有趣的。现在,我想知道C#中的Properties和Accessor方法是否相同?还是C#已经自动返回克隆的副本? 谢谢。 问题答案: 引用就是……对存储在内存中的某个对象的引用。除非您明确编写代码以创建克隆并返回对该对象 的引用 ,否则您将始终绕过对同一实例的引用。 它试图避免您遇到的情况是将对象引用移交给您所依赖的调用方。您无法控制谁

  • 问题内容: 我刚遇到以下代码: 毫无疑问,运行此代码将产生“返回值:3”的输出。 但是,我对此感到好奇: JVM中的内部机制。有谁知道VM是否通过覆盖第一个“ return 1”来实际替换堆栈上的返回值?如果是这样,我在哪里可以找到更多信息。 我还没有找到以这种方式使用并允许在JVM中实现的final机制中的返回值的用法。如果将此代码构造用作返回错误代码的手段,我认为有更好的方法记录错误或返回这些

  • (在本例中,假设是的有效索引,并且代码不会引发) 编辑:问题不是关于使用的必要性,而是关于我选择这样做时在性能上的任何收益或损失。没有它,就会创建一个变量。使用它,返回的值被存储在其他地方,也许是以一种更有效的方式。

  • 问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处: