2012-01-18 8 views
4

MatchErrorをキャッチする最良の方法(簡潔、明確、慣用)は、パターンマッチングで値を割り当てるときですか?Scalaのパターンマッチングでval初期化で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 } 

はこれを行うための慣用的な方法はありますか?

+1

また、 'scala.util.control.Exception'を使うこともできます。 –

+1

予想される動作は何ですか? – missingfaktor

+2

'MatchError'は、パターンマッチの代入が失敗した場合にスローするのとまったく同じものではありませんか?さもなければ私は個人的に問題を別の方法で処理するために他の制御構造を使用します。 –

答えて

6

は少しキムのソリューションに向上:

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

あなたがエラーを処理する方法をについてより多くの情報を提供することができれば、我々はあなたに、より良いソリューションを提供することができます。

+0

処理について - おそらく、適切な例外をスローするだけです。 – Rogach

7

なぜ単に

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

+1

これはまだ4行の長さであり、複雑なパターンマッチでばかげたコードの重複があります。 – Rogach

+0

複雑なパターンマッチでは、例外を伴う複数の代入を使用することは本当に混乱します。キムの答えは、まったく慣用的なものです。 – Nicolas

1

以下はエラーをキャッチしませんが、Nicolasのコメントを参照してください。これが質問者にとって面白いかどうかはわかりません。

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

要素が2つ未満の場合は、何も回避しません。 – Nicolas

0

簡単な解決策はこれです:

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

それは冗長であるので、私は、二回一致して好きではありません。 パターンマッチングのある「val」は、マッチしたことが確かな場合、またはtry/catchブロックを追加する場合にのみ使用してください。

関連する問題