使用trycatch捕获R中的网络错误

时间:2014-07-24 04:50:00

标签: r networking

我正在使用两个服务decode_short_url(twitteR包)和get_url(socialmediamineR包)来扩展R中的短网址。我在下面给出的函数urltry()尝试扩展url并捕获所有类型的可能错误。

#install.packages("twitteR")
#install.packages("SocialMediaMineR")
library(twitteR)
library(SocialMediaMineR)

urltry <- function(x) {    
    tryCatch(
        { x <- decode_short_url(x)  },
        error = function(e)
        {
          x <- urltryfail(x)
          return(x)
        }   
    )  
}    

urltryfail <- function(x) {    
    tryCatch(
    {
    x <- get_url(x, sleep.time = 1, return.df = T)
    x <- as.character(x$resolvedURL)  },
    error = function(e)
        {
          return(x)
        },
    finally ={ x }  
    )  
}

但是当decode_short_url和get_url因网络错误而失败时。我得到了一个返回值

  

函数错误(type,msg,asError = TRUE):无法连接   主机\ n

来自函数urltry(),而不是捕获错误并返回短URL。

sample data

1 个答案:

答案 0 :(得分:0)

问题出在SocialMediaMineR包中的 get_url()函数中。如果URL无法解析,它会在内部从httr包返回时捕获错误。所以错误永远不会到达你的tryCatch函数。 get_url始终返回有效的数据帧。 因此,如果网址无效,您始终会获得包含 originalURL resolvedURL 列的数据框,但resolveURL列包含错误消息。

+-------------+-----------------------------------------------------------------------------------+
| originalURL | resolvedURL                                                                       |
+-------------+-----------------------------------------------------------------------------------+
| sdgsdg      | Error in function (type, msg, asError = TRUE),: \n,Could not resolve host: http\n |
+-------------+-----------------------------------------------------------------------------------+

所以你基本上要选择:

1 :) 检查返回的数据帧是否包含短语&#34;功能错误&#34;在resolvedURL列中。如果是,您只需使用originalURL

2 :) 您从SocialMediaMineR中复制粘贴来自get_url()函数的代码并稍微修改它。你只需要删除HEAD(x)$ url周围的try()。现在,如果使用不可解析的URL调用get_url函数,它只会中断并抛出一个错误,这将使您的tryCatch函数实际识别它并跳转到您在代码中定义的错误函数。

get_url <-
function(links, sleep.time=0, return.df=F){
    final_url <- function(x) HEAD(x)$url
    final_url2 <- function(x) {
        Sys.sleep(sleep.time)
        cat(".")
        final_url(x)
    }
    if(return.df==F) { 
        return(vapply(links, final_url2, character(1)))
    } else {
        temp <- vapply(links, final_url2, character(1))
        url.result <- data.frame(originalURL=names(temp), resolvedURL=as.character(temp))
        return(url.result)
    }
}