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