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

gfx*_*onk 14 syntax scala 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)
}
Run Code Online (Sandbox Code Playgroud)

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

case e:ClassCastException | e:JSONException => throw new ParseException(body, e)
Run Code Online (Sandbox Code Playgroud)

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

case e:Exception(ClassCastException|JSONException) => throw new ParseException(body, e)
Run Code Online (Sandbox Code Playgroud)

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

ret*_*nym 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)
}
Run Code Online (Sandbox Code Playgroud)


oxb*_*kes 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
Run Code Online (Sandbox Code Playgroud)

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