Подтвердить что ты не робот

Сопоставление (и привязка) двух классов исключений в одном случае в Scala 2.7?

У меня есть следующий код:

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)

Это явно не правильный синтаксис, но, надеюсь, вы понимаете, что я имею в виду. Возможно ли это?

4b9b3361

Ответ 1

Вы не можете вводить привязки внутри альтернатив шаблонов (PatternA | PatternB). Но вы можете связать имя с результатом альтернативных шаблонов с помощью связующего шаблона (name @ Pattern).

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

Ответ 2

Вы можете использовать новые конструкторы 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.)