【发布时间】:2021-03-10 23:16:35
【问题描述】:
我有一个可能会引发错误的函数。当抛出错误时,我想显示错误消息,就好像错误确实发生了一样,并进一步无形地返回一个对象。
我查看了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,否则什么都不做。
【问题讨论】:
-
对我来说,“throw an error” 意味着函数在无法继续的前提下故意放弃控制。然后返回一个值与此相反。您是否有可能想要记录一个错误然后返回一些东西,但是您提到
withCallingHandlers,听起来这可能不是您需要的。 -
我担心我的想法是不可能的。在这种情况下,是否可以以接近真实错误消息的方式显示记录的错误消息?
-
您可以发出(严厉的?)
warning,其显示类似于错误。由于控制没有被破坏,你可以警告然后return。 -
抱歉删除了我之前的评论,因为不可见......这样做就足够了
if(y == 2) { tryCatch(stop("oops"), error=function(.) message(conditionMessage(.))) return(invisible(y)) }。虽然在错误消息上仍然不太正确 -
@user20650:再次感谢您的方法!我将它与 r2evans 的答案结合起来,一旦结合起来,这完全解决了我的问题。
标签: r error-handling