3
我有一个函数:嵌套tryCatch没有捕获错误?
buggy <- function(...) {
tryCatch({
itWorked <- FALSE
stop("I don't like green eggs and ham!")
itWorked <- TRUE
}, finally = {
if (itWorked)
return("I do, Sam I am")
else
return("I do not like them, Sam I am!")
})
}
基本上,buggy
试图做一些计算,可能会或可能不会成功(由itWorked
确定finally
条款只是确保即使计算没有工作,东西。获取返回(在这种情况下,"I do not like them, Sam I am!"
)
它按预期工作:
> buggy()
Error in tryCatchList(expr, classes, parentenv, handlers) :
I don't like green eggs and ham!
[1] "I do not like them, Sam I am!"
现在,我要听为错误:
tryCatch(buggy(),
error=function(e) message('too bad! there was an error'))
然而在buggy
错误失败周边tryCatch
引发错误:
> tryCatch(buggy(),
+ error=function(e) message('too bad! there was an error'))
[1] "I do not like them, Sam I am!"
我希望是这样说的:
'too bad! there was an error'
[1] "I do not like them, Sam I am!"
谁能告诉我为什么这不起作用?我是否需要在buggy
内“提高”错误?
喔,我明白了。那么为什么'buggy'在错误时返回一个值(在我的情况下是计算的中间步骤,我仍然可以使用它,但是不想重新计算它)的标准过程是什么?错误发生了(因此返回的结果是中间而不是最后一个)? – 2012-04-19 06:34:56
忘记我刚刚说的,我刚刚意识到在我的*特殊情况下,以下将为我的'finally'(我有一个参数'return.intermediate.on.error'):'if(itWorked || return。 intermediate.on.error){return(...)} else {stop(reason_for_failure)}',我想我必须在计算中存储'reason_for_failure'。但它似乎并不是“R方式”。很高兴地说:'error = function(e){raise_error();返回(...)}'。 – 2012-04-19 06:41:57
会使用'warning()'产生一个警告(而不是'stop()'产生一个错误)符合你的目的吗?既然听起来好像你只是想通过一条信息通知某事出了问题,那可能是最简单的解决方案。 – 2012-04-19 06:45:40