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

но Скала не позволит мне связать e для обоих типов - достаточно честно. В обработчике мне нужно только лечить e как будто это было типа Exception, но я хочу соответствовать в первую очередь, если это один из тех конкретных классов. Что-то вроде наличия условия после сопоставленного типа, например:

case e:Exception(ClassCastException|JSONException) => throw new ParseException(body, e)

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

2 ответа

Решение

Вы не можете ввести привязки внутри шаблонных альтернатив (PatternA | PatternB). Но вы можете связать имя с результатом Pattern Patterns с помощью Pattern Binder (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.)

Другие вопросы по тегам