Source.fromURL不会为无效的URL抛出异常

时间:2013-02-27 20:49:22

标签: scala

我正在尝试检索各种网站的大小,这些网站的网址会传递给我的脚本,但是当我传递无效的网址时,我没有收到异常,而只是获取一个非常小的网页。我正在使用Source.fromURL,我得到以下结果:

thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway 1052
www.bbc.co.uk 113871

第一个,正如它所说,不应该有任何东西,但确实如此。我的脚本如下:

def main( args:Array[String] ){
    val tasks = for(arg <- args) yield future {
        try {
            println(arg + " " + Source.fromURL( attachPrefix(arg) ).length)
        } catch {
            case e : java.net.UnknownHostException => println(arg + " *")
        }
    }

    awaitAll(20000L, tasks: _*)
}

def attachPrefix( url:String ) = url.slice(0, 4) match {
    case "http" => url
    case "www." => "http://" + url
    case _ => "http://www." + url
}

每个参数都被传递到函数attachPrefix,以确保它在使用之前具有必要的前缀。这个问题只是因为我开始将url作为参数传递而不是将其映射到arg,这就是我之前用

做的事情。
args map attachPrefix

两者之间有什么区别,为什么我现在的人会给出这样的行为?

1 个答案:

答案 0 :(得分:1)

您可以使用Source.fromURL(URI)签名。创建URI将有效地验证URL所记录的here。但是,在这种情况下,就URL而言,http://www.thisIsClearlyABoggusURLThatCantPossiblyLead‌​Anyway URI有效。另一方面,om-nom-nom建议的UrlValidator认为它无效,因为顶级域名有超过4个字符已经过时。我不知道任何完全Scala验证库或为什么这是一个要求,但您可以尝试使用正则表达式进行验证。例如,这将抓住您的示例,因为顶级域超过6个字母:

val re = """^(https?://)?(([\w!~*'().&=+$%-]+: )?[\w!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)*([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?:@&=+$,%#-]+)+/*)$""".r
re.pattern.matcher("http://google.com").matches // true
re.pattern.matcher("http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway").matches // false