我应该如何处理理解中的潜在例外?在这个例子中,我想处理当行格式不正确时发生的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
}
Scala 2.10的Try
在这里可能会有所帮助,但我仍然在使用2.9.2。
答案 0 :(得分:4)
似乎更容易使用匹配运算符
line.split("\t") match {
case Array(a, s, _ @ _*) => (a, s)
case _ => throw new MatchError("Line '"+line+"' not in proper form")
}
答案 1 :(得分: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
在这里稍微有点帮助;我不担心。
答案 2 :(得分:1)
如果按照om-nom-nom的建议你可以尝试,你可以做这样的事情
Array( annotation, string, _@ _* ) =
Try( line.split( "\t" )).recover({ case e: Exception => Failure(new MyException("my message")) }).get
简而言之,你的 recover ,在你想要的内容中重新包装Exception,然后打开结果或使用get
如果您无法掌握Try
,因为try...catch
是Scala中的表达式而不是语句,您可以使用它编写几乎相同的内容。
Array( annotation, string, _@ _* ) =
try { line.split( "\t" )} catch { case e: Exception => throw new MyException("my message")}