【问题标题】:Catch network errors in R using trycatch使用 trycatch 在 R 中捕获网络错误
【发布时间】:2018-10-22 01:52:52
【问题描述】:

我正在使用两个服务 decode_short_url(twitteR 包)和 get_url(socialmediamineR 包)来扩展 R 中的短 url。下面给出的我的函数 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 由于网络错误而失败时。我得到一个返回值

函数错误(类型、msg、asError = TRUE):无法连接到 主机\n

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

sample data

【问题讨论】:

  • 您正在使用任何特殊的软件包吗?一个工作示例怎么样,以便我们可以对其进行尝试?
  • 您好@RomanLuštrik,感谢您的建议,我已在上面的代码中添加了所需的包。您现在将能够运行该功能。再次感谢:)

标签: r networking


【解决方案1】:

问题出在 SocialMediaMineR 包中的 get_url() 函数中。如果 URL 不可解析,它会在内部从 httr 包返回时捕获错误。因此错误永远不会到达您的 tryCatch 函数。 get_url 总是返回一个有效的数据帧。 因此,如果 URL 无效,您总是会得到一个包含 originalURLresolvedURL 列的数据框,但 resolvedURL 列包含错误消息。

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

所以你基本上必须选择:

1:) 您检查返回的数据框是否在 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)
    }
}

【讨论】:

  • 我应该检查一下 get_url 源代码。总之非常感谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2016-12-30
  • 1970-01-01
  • 2017-04-10
  • 2017-02-06
相关资源
最近更新 更多