处理异常以便理解

时间:2013-03-20 15:58:26

标签: scala exception

我应该如何处理理解中的潜在例外?在这个例子中,我想处理当行格式不正确时发生的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。

3 个答案:

答案 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")}