Совпадение (и связывание) двух классов исключений в одной инструкции case в Scala 2.7? - PullRequest
14 голосов
/ 11 июля 2010

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

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)

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

Ответы [ 2 ]

24 голосов
/ 11 июля 2010

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

try {
    < ... some JSON parsing code .. >
} catch {
    case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e)
}
8 голосов
/ 11 июля 2010

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

...