2011-12-12 23 views
17

Gdy wzorzec pasujący do wyjątku z instrukcją przypadku jest bardziej uproszczony sposób dopasowania tego samego wyjątku do zestawu typów wyjątków? Zamiast tego:Dopasowywanie wielu typów wyjątków do tego samego przypadku

} catch { 
    case e if e.isInstanceOf[MappingException] || e.isInstanceOf[ParseException] => 

Coś takiego byłoby miło:

case e: MappingException | ParseException | SomeOtherException => 

Czy coś takiego jest możliwe?

+0

możliwe duplikat [Catching wielu wyjątków naraz w Scala] (http://stackoverflow.com/questions/6384073/catching-multiple-exceptions-at-once-in-scala) – agilesteel

Odpowiedz

42

Można to zrobić:

catch { 
    case e @ (_: MappingException | _: ParseException | _: SomeOtherException) => 
} 

Jeśli próbujesz zapisać kilka linijek kodu i obsługiwać te same rodzaje wyjątków regularnie, można rozważyć zdefiniowania funkcji częściowej wcześniej użyć jako przewodnika :

val myHandler: PartialFunction[Throwable, Unit] = { 
    case e @ (_: MappingException | _: ParseException | _: SomeOtherException) => 
} 

try { 
    throw new MappingException("argh!") 
} catch myHandler 
+4

Bardzo mądry! Dziękuję za odpowiedź. – Josh

+0

Czy to jest specjalny przypadek, czy jest to funkcja językowa ... czy możesz wyjaśnić, jak to działa/rozszerza się na zewnątrz? – monksy

+0

Pomocne :) Dzięki ... –

Powiązane problemy