在Scala 2.7中的一个case语句中匹配(和绑定)两个异常类?

时间:2010-07-11 10:27:16

标签: scala syntax exception-handling case

我有以下代码:

try {
    < ... some JSON parsing code .. >
} 
catch {
    case e:ClassCastException => throw new ParseException(body, e)
    case e:JSONException => throw new ParseException(body, e)
}

这似乎过于重复。我试过了

case e:ClassCastException | e:JSONException => throw new ParseException(body, e)

但是Scala不允许我将e绑定到这两种类型 - 足够公平。在处理程序中,我只需将e视为Exception类型,但我只想在第一个位置匹配,如果它是那些特定类之一。像匹配类型之后的条件,如:

case e:Exception(ClassCastException|JSONException) => throw new ParseException(body, e)

这显然不是正确的语法,但希望你明白我的意思。这样的事情有可能吗?

2 个答案:

答案 0 :(得分:24)

您无法在Pattern Alternatives(PatternA | PatternB)中引入绑定。但是您可以使用Pattern Binder(name @ Pattern)将名称绑定到Pattern Alternatives的结果。

try {
    < ... some JSON parsing code .. >
} catch {
    case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e)
}

答案 1 :(得分:8)

您可以使用新的2.8控件构造:

def foo = //JSON parsing code

import util.control.Exception._
handling(classOf[ClassCastException], classOf[JSONException]) by (t => throw new ParseException(t)) apply foo

(那里可能有一个错误。我找不到jabscreen的REPL。)