我有一个可能会引发错误的函数。当抛出错误时,我想显示错误消息,就像错误确实发生一样,并进一步以不可见的方式返回一个对象。
我查看了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/