2012-04-19 89 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