Соответствие (и привязка) два класса исключений в одном операторе выбора в 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)

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

14
задан Peter Mortensen 10 May 2013 в 08:11
поделиться

2 ответа

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

try {
    < ... some JSON parsing code .. >
} catch {
    case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e)
}
24
ответ дан 1 December 2019 в 08:42
поделиться

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

8
ответ дан 1 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: