2013-02-27 69 views
2

我试图检索其URL将传递给我的脚本的各种网站的大小,但是当我传递一个无效URL时,我没有收到异常,而是简单地获取一个非常小的页面。我使用Source.fromURL,我得到下面的结果:Source.fromURL不会抛出一个无效URL的例外

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 

做什么是两者之间的区别,为什么是我目前的一个给这样的行为?

+0

您可以使用[Java的方法(http://stackoverflow.com/q/2230676/298389) – 2013-02-27 20:54:46

+0

非常感谢对于这个建议。我不知道那个:)然而,在这种情况下,我需要它在纯粹的斯卡拉。 – 2013-02-27 20:56:54

+1

'scala.io.Source.fromURL(“http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway”)'抛出'java.net.UnknownHostException'。我想知道你的代码检索的大小正在做什么?你的代码中是否有'toString' - 实际上是检索异常文本的长度,也许......? – Hbf 2013-02-27 21:48:00

回答

1

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

val re = """^(https?://)?(([\w!~*'().&=+$%-]+:)?[\w!~*'().&=+$%-][email protected])?(([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 
相关问题