第一:永遠不要在你的生活中繼續使用那個繼續構造。這是沒用的。 tryCatch()
將繼續如果您爲錯誤或警告定義處理程序。它將使用那個而不是「默認」error=function(e) stop(e)
。這一個將停止你的功能。如果您定義了處理程序(warning=
或error=
),您的腳本將不會停止,因此無需繼續。
此說:在這種情況下,正確使用tryCatch的是:
for(i in 1:nrow(symbol)){
tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), error = function(e){})
}
,或者,如果你在腳本中使用它,並希望在發生錯誤時要到下一個循環,你可以簡單地用途:
for(i in 1:nrow(symbol)){
prices <- try(getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), silent=TRUE)
if(inherits(prices,"try-error")) { next } # only true if an error occurs
... # rest of calculations
}
如果你要使用tryCatch的這樣或嘗試,你就不必了,你在這裏報告的問題。
現在我可以重現你的情況,如果我使用不存在的符號。你錯誤地使用tryCatch()
函數會給你帶來麻煩。 read.table
返回錯誤(Error in file(file, "rt") : cannot open the connection
)。這是一個錯誤,不是一個警告。你會得到一個額外的警告,說404文件沒有找到返回。
當警告與錯誤一起發出時,首先處理警告的處理函數。這是因爲在函數停止之前必須拋出警告。因此,它不會處理您收到的錯誤,這意味着read.table()
中的on.exit(close(file))
將不會被調用。因此,連接沒有正確關閉,仍然被認爲是開放的,儘管它不能被R(showAllConnections()顯示)找到。由於未處理錯誤,連接註冊時出現問題。由於連接無法打開,on.exit(close(...))
將不起作用。 showConnections()
不顯示連接,但不知何故R仍然認爲它在那裏。因此,所有地獄崩潰,你崩潰你的河。
感謝更正@Tommy
一個簡單的代碼的例子來說明這一點:
myfun <- function(x){
if(x>1) warning("aWarning")
stop("aStop")
x
}
tryCatch(myfun(0.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "stop"
tryCatch(myfun(1.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "warning"
總結:
- 檢查你使用的符號。他們可能是錯的。
- 如果您希望發生錯誤,請不要再使用警告處理程序。
而且作爲一個額外的:你的循環只會返回最後調用的結果,因爲你每次都要經過循環時間覆蓋prices
,如果你要使用正確的符號。
編輯:如果你想繼續行動
在我的系統上不可重現。什麼是你使用的符號向量?嘗試'輸入(符號)'並給我們輸出。 –
你是如何重現它的?我使用這個功能下載大約3000股股票價格 – Dail
首先,我沒有。直到我發現我必須有一些錯誤和警告。所以我解決了你的問題,但你應該對發佈的代碼進行嚴格的打分。 ;) –