我试图编写一个函数来处理批处理作业的执行,记录作业结果的错误和统计信息。
是否有方法从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)
}
我建议这不是最后使用的最佳方式。
有以下最佳实践可供使用
最后
(http://adv-r.had.co.nz/Exceptions-Debugging.html):
它指定要运行的代码块(不是函数),无论初始表达式是成功还是失败。这对于清理(例如,删除文件、关闭连接)非常有用。这在功能上等同于在上使用。exit(),但它可以封装比整个函数更小的代码块。
如果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机制中的返回值的用法。如果将此代码构造用作返回错误代码的手段,我认为有更好的方法记录错误或返回这些
(在本例中,假设是的有效索引,并且代码不会引发) 编辑:问题不是关于使用的必要性,而是关于我选择这样做时在性能上的任何收益或损失。没有它,就会创建一个变量。使用它,返回的值被存储在其他地方,也许是以一种更有效的方式。
问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处: