我有以下代码:
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)
这显然不是正确的语法,但希望你明白我的意思。这样的事情有可能吗?
答案 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。)