当抛出错误时,R 以不可见的方式返回对象和正常错误

标签 r error-handling

我有一个可能会引发错误的函数。当抛出错误时,我想显示错误消息,就像错误确实发生一样,并进一步以不可见的方式返回一个对象。

我查看了this thread ,它使用 withCallingHandlers并将错误消息记录在某处。这很接近,但我不想将消息记录为文本,然后打印文本消息,该函数应该显示错误消息,就好像它会因错误而退出一样。

函数工作流程如下所示:

foo <- function(x){

  y <- x + 1
  
    if(y == 2) {
    stop("oops")
    # also return y invisibly when error is thrown,
  }
  
  z <- y + 1
  z
  
}

基于输入x中间体y被计算。 y用于错误检查。如果出现错误y应该以不可见的方式返回,并且应该抛出正常的错误消息。否则z计算并返回。

foo(1)应该返回错误消息和 y看不见的。

我考虑过使用on.exit但在这种情况下,总是y是无形的回归。

感谢任何帮助。

补充:也许我的想法是不可能的。在这种情况下,是否可以以接近真实错误消息的方式显示记录的错误消息?

Add2:我想过发出警告,但在我的实际用例中 warning会产生误导,因为该函数不会产生所需的结果 z ,但只是一些中间结果 y我想返回y以便用户可以进一步检查它,并解释为什么 foo 没有正确处理它。 。想一想,其他人肯定也遇到过同样的问题,应该有某种解决方案。

Add3:也许可以使用on.exit连同被触发的标志,以便 on.exit将返回y如果发生错误,则不可见,否则不执行任何操作。

最佳答案

func <- function(x) { a <- simpleError("quux"); attr(a,"abc") <- 7; stop(a); }
func()
# Error: quux

到目前为止一切顺利,我们看到一个错误。如果我们捕获此错误并查看错误消息的内容,我们可以看到隐藏在其中的属性:

dput(tryCatch(func(), error=function(e) e))
# structure(list(message = "quux", call = NULL), class = c("simpleError", 
# "error", "condition"), abc = 7)

甚至可以轻松提取

dput(tryCatch(func(), error=function(e) attr(e,"abc")))
# 7

关于当抛出错误时,R 以不可见的方式返回对象和正常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66574267/

相关文章:

r - 你如何在 R 中反转 lapply 的函数参数?

使用 data() 的 R 包命名空间问题——未找到数据集

javascript - 故意在JavaScript中创建新错误以检查代码行为

powershell - PowerShell和进程退出代码

返回一个函数列表,这被认为是 OOP 吗?

r - 隔离r数据框中的部分文本

php - 谁能用 PHP -> $a{0} = "value"解释这个数组声明

powershell - 如何捕获未找到文件的错误?

arrays - 函数类似于Matlab中的head()

go - 发生http超时时,如何获取json.NewDecoder(body).Decode()的错误原因?