2012-04-19 125 views
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内“提高”错误?

回答

2

tryCatch()不给你存储在其error论据完全相同同样的原因消息,下面的调用不:

tryCatch("I do not like them, Sam I am!", 
    error=function(e) message('too bad! there was an error')) 
# [1] "I do not like them, Sam I am!" 

error参数消息两行了会只有在buggy()返回错误时才会被调用。而是(感谢tryCatch()里面的它的工作),buggy()只返回一个特征向量,并tryCatch()无关“抓”:

value <- buggy() 
value 
# [1] "I do not like them, Sam I am!" 

# And, to belabor the point: 
identical(buggy(), "I do not like them, Sam I am!") 
# [1] TRUE 
+0

喔,我明白了。那么为什么'buggy'在错误时返回一个值(在我的情况下是计算的中间步骤,我仍然可以使用它,但是不想重新计算它)的标准过程是什么?错误发生了(因此返回的结果是中间而不是最后一个)? – 2012-04-19 06:34:56

+0

忘记我刚刚说的,我刚刚意识到在我的*特殊情况下,以下将为我的'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

+0

会使用'warning()'产生一个警告(而不是'stop()'产生一个错误)符合你的目的吗?既然听起来好像你只是想通过一条信息通知某事出了问题,那可能是最简单的解决方案。 – 2012-04-19 06:45:40