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