У меня есть следующий код:
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)
Это - очевидно, не правильный синтаксис, но надо надеяться Вы видите то, что я имею в виду. Действительно ли такая вещь возможна?
Вы не можете вводить связывание внутри альтернативных шаблонов (PatternA | PatternB
). Но вы можете связать имя с результатом альтернативных шаблонов с помощью связки шаблонов (name @ Pattern
).
try {
< ... some JSON parsing code .. >
} catch {
case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e)
}
Вы можете использовать новые управляющие конструкции 2.8:
def foo = //JSON parsing code
import util.control.Exception._
handling(classOf[ClassCastException], classOf[JSONException]) by (t => throw new ParseException(t)) apply foo
(Вероятно, здесь есть ошибка. Я не могу найти REPL для jabscreen.)