在val初始化时捕获MatchError并使用Scala中的模式匹配?

时间:2012-01-18 10:40:45

标签: scala

在为模式匹配赋值时,捕获MatchError的最佳方式(最简洁,最清晰,最惯用)是什么?

示例:

val a :: b :: Nil = List(1,2,3) // throws scala.MatchError

到目前为止我发现的最佳方式:

val a :: b :: Nil = try {
    val a1 :: b1 :: Nil = List(1,2,3)
    List(a1, b1)
  catch { case e:MatchError => // handle error here }

有没有惯用的方法呢?

4 个答案:

答案 0 :(得分:7)

为什么不简单

val a::b::Nil = List(1,2,3) match {
  case a1::b1::Nil => {
    a1::b1::Nil
  }
  case _ => //handle error
}

答案 1 :(得分:6)

对Kim的解决方案略有改进:

val a :: b :: Nil = List(1, 2, 3) match {
  case x @ _ :: _ :: Nil => x
  case _ => //handle error
}

如果您可以提供有关如何处理错误的更多信息,我们可以为您提供更好的解决方案。

答案 2 :(得分:1)

以下内容并未发现错误,但避免了(其中一些;请参阅Nicolas的评论)。我不知道这对提问者是否有趣。

scala> val a :: b :: _ = List(1,2,3)
a: Int = 1
b: Int = 2

答案 3 :(得分:0)

简单的解决方案就是:

List(1, 2, 3) match {
   case a :: b :: Nil => .....
   case _ => // handle error
}

我不喜欢两次匹配,因为它是多余的。 带有模式匹配的“val”只应在您确定匹配时使用,或者添加try / catch块。