所有连接都在使用中:执行暂停

时间:2011-08-18 06:47:00

标签: r error-handling try-catch

我非常强烈地使用 TTR 包中的getYahooData()功能。

我有这段代码:

for(i in 1:nrow(symbol)){
    tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily", 
                                    type="price"), 
             warning=function(e) continue <- 0)
    if (continue==0) next
}

此循环很长我收到此错误:

  

文件错误(文件,“rt”):所有连接都在使用中调用:tryCatch   ... doTryCatch - &gt; getYahooData - &gt; getYahooData - &gt; read.table - &gt;文件   执行暂停

我该怎么办?

更新

如果我使用closeAllConnections(),我得到:

 I get: *** caught segfault *** address (nil), cause 'memory not mapped' Traceback: 1: getConnection(set[i]) 2: close(getConnection(set[i])) 3: closeAllConnections() aborting ... 

4 个答案:

答案 0 :(得分:15)

第一:永远不要在你的生活中使用那种继续建构。这是没用的。如果您为错误或警告定义了处理程序,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文件。

当警告与错误一起发出时,首先处理警告的处理函数。那是因为在停止函数之前必须抛出警告。所以它不会处理你得到的错误,这意味着on.exit(close(file))中的read.table()将不会被调用。因此,连接没有正确关闭并且仍然被认为是开放的,虽然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,以防你使用正确的符号。

编辑:如果您想继续操作

答案 1 :(得分:10)

关闭一些连接?可以像在循环体的末尾插入closeAllConnections()一样简单。

答案 2 :(得分:8)

这确实是R源代码中有关如何注册连接的错误。我在R Bugzilla网站上发布了一些评论和补丁:http://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14660。 Joris的建议是合理的。但是,当修复错误时,closeAllConnections()也将起作用。 (P.S.这是我的第一篇StackOverflow帖子。如果我违反了礼仪,请原谅我。)

答案 3 :(得分:0)

在我过去挖掘的某个地方,有人提到在read.table.url()或url()等函数中使用URL引用会调用一个有点错误的本机R HTTP连接器。事实证明,在错误时关闭连接更有效的方法是在read.table()或等效的函数调用中显式调用RCurl。例如,当累积大量HTTP错误时,这给我带来了问题:

result <- try ( DF <- read.table(con <- url(url), col.names=colNames),
silent=TRUE )

我已经看到RCurl变体的好结果,调用它的getURL函数:

result <- try ( DF <- read.table(textConnection(getURL(url)), col.names=colNames),
silent=TRUE )

这是在运行R v2.15.3。