2013-02-27 70 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 
相關問題