2013-03-20 115 views
2

我應該如何處理理解中的潛在異常?在這個例子中,我想處理MatchException,當行格式不正確時出現。我想拋出一個更多信息的例外,包括行字符串。問題是行字符串只知道裏面的用於理解,但傳統的錯誤處理用try/catch會是以外的的理解。處理理解異常

val gold = Resource.using (Source.fromFile(file)) { source => 
     (for { 
     line <- source.getLines 
     Array(annotation, string, _ @ _*) = line.split("\t") 
     boolean = if (annotation == "1") true else false 
     } yield { 
     string -> boolean 
     }).toMap 
    } 

斯卡拉2.10的Try可能會有所幫助在這裏,但我仍然在2.9.2。

+2

貌似[嘗試是回遷到2.9.3(http://www.scala-lang.org/api/2.9.3/index.html #scala.util.Try)以及Futures和Promises,因此您可以輕鬆遷移到2.9.3(與2.9.1/2進行二進制兼容,只是交換工件)並享受它。 – 2013-03-20 16:04:29

+0

酷,我仍然不知道我會如何使用它來獲得行文本。 – schmmd 2013-03-20 16:14:21

回答

2

如果你想要做的就是更新您的例外是更詳細,您可以:

for { 
    line <- List("salmon\tcod", "wooble") 
    (annotation, string) = try { 
    val Array(a, s, _ @ _*) = line.split("\t"); (a, s) 
    } catch { 
    case me: MatchError => throw new MatchError("Line '"+line+"' not in proper form") 
    } 
    boolean = (annotation=="1") 
} yield (string -> boolean) 

也就是說,執行分析並返回你想要什麼try塊內。 Try在這裏只有一點幫助;我不會爲此擔心。

1

如果OM-NOM-NOM的建議你得到嘗試,你可以做這樣的事情

Array(annotation, string, [email protected] _*) = 
       Try(line.split("\t")).recover({ case e: Exception => Failure(new MyException("my message")) }).get 

總之你恢復,重新包裝異常在你想要然後解開的結果或拋使用get

如果你不能因爲try...catch得到Try保持新的異常是Scala和表達不是一條語句,你可以用它寫幾乎同樣的事情。

Array(annotation, string, [email protected] _*) = 
try { line.split("\t")} catch { case e: Exception => throw new MyException("my message")} 
4

似乎更易於使用的匹配運算

line.split("\t") match { 
    case Array(a, s, _ @ _*) => (a, s) 
    case _ => throw new MatchError("Line '"+line+"' not in proper form") 
}