Scala Source.fromURL未引发无效URL的异常

Scala Source.fromURL未引发无效URL的异常,scala,Scala,我试图检索各种网站的大小,这些网站的URL将被传递到我的脚本中,但是当我传递一个无效的URL时,我没有得到异常,而只是得到一个非常小的页面。我使用的是Source.fromURL,我得到了以下结果: thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway 1052 www.bbc.co.uk 113871 第一个,正如它所说,不应该有任何东西,但它有。我的脚本如下: def main( args:Array[String] ){ val ta

我试图检索各种网站的大小,这些网站的URL将被传递到我的脚本中,但是当我传递一个无效的URL时,我没有得到异常,而只是得到一个非常小的页面。我使用的是
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
}

两者之间有什么区别,为什么我当前的一个给出了这样的行为?

您可以使用
Source.fromURL(URI)
签名。创建
URI
将有效地验证文档中的
URL
。但是,在这种情况下,
URL
http://www.thisIsClearlyABoggusURLThatCantPossiblyLead‌​无论如何
对于
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

谢谢你的建议。我不知道这个:)但是,在本例中,我需要它是纯Scala。
Scala.io.Source.fromURL(“http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway“”
抛出
java.net.UnknownHostException
。我想知道你检索大小的代码到底在做什么?您的代码中是否有
toString
,并且实际上正在检索异常文本的长度,可能是…?@Hbf,在阅读您的评论后,我对代码进行了处理,找出了问题的原因,但我不知道是什么原因造成的。我已经用完整的代码更新了我的问题。
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