2

我应该如何处理理解中的潜在异常?在此示例中,我想处理MatchException行格式不正确时发生的 a 。我想抛出一个包含行字符串的更多信息异常。问题是行字符串仅for 理解中已知,但传统的错误处理try/catch将在 for 理解之外

    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.10Try在这里可能会有所帮助,但我仍在使用 2.9.2。

4

3 回答 3

4

使用匹配运算符似乎更简单

line.split("\t") match {
  case Array(a, s, _ @ _*) => (a, s)
  case _ => throw new MatchError("Line '"+line+"' not in proper form")
}
于 2013-03-20T17:10:13.597 回答
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在这里只是有点帮助;我不会担心的。

于 2013-03-20T16:33:08.563 回答
1

如果按照 om-nom-nom 的建议,你得到了 Try,你可以做这样的事情

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

简而言之,您的恢复,将 Exception 重新包装为您想要的内容,然后解包结果或使用抛出新异常get

如果你无法掌握ScalaTrytry...catch的 as is an expression 而不是 statement,你可以使用它编写几乎相同的东西。

Array( annotation, string, _@ _* ) = 
try { line.split( "\t" )} catch { case e: Exception =>  throw new MyException("my message")}
于 2013-03-20T16:24:51.323 回答