因此,我一直試圖將一些Java代碼示例從一本書轉換成習慣用法的Scala,以加強我的Scala學習。我對小東西感到滿意,但在使用for
表達式時卻無縫處理異常,令我難以置信。用於表達式的默認處理異常處理
前提是:給定主機名列表,檢索主機名/ IP地址元組列表。聽起來很簡單,良好的情況下正常工作,即
def printHostInfo(args: Array[String]) {
val tuples = for {
arg <- args
inet <- InetAddress.getAllByName(arg.trim)
} yield (inet.getHostName, inet.getHostAddress)
println(tuples mkString "; ")
}
但現在到了困難的部分:我希望能夠輕鬆地與發生時,我輸入一個壞的主機名例外處理。我可以使用新的Try
結構,但它只是避免了這個問題。
def printHostInfo(args: Array[String]) {
val tuples = for {
arg <- args
inet <- Try(InetAddress.getAllByName(arg.trim)) getOrElse Array()
} yield (inet.getHostName, inet.getHostAddress)
println(tuples mkString "; ")
}
在上面的代碼片段中,如果主機名稱不正確,則會跳過該條目,我們都很高興。 但是,我想要做的是在主機壞的情況下,檢索像(www.hostname.com, Bad host name)
這樣的元組。我試圖搞亂Option
和其他的東西,但我得到編譯時錯誤,我還沒有資格解密。有人可以建議一個簡潔的慣用解決方案,並使用Scala提供的全部功能嗎?謝謝。
爲什麼不把地址分辨率移到'yield'表達式? –
@TheTerribleSwiftTomato:不知道我明白,也許你可以發表一個例子? – sasuke
終於能夠解決這個問題,張貼爲答案。 –