2010-07-11 6 views
14

Ho il codice seguente:Corrispondenti (e vincolanti) due classi di eccezioni in una dichiarazione di caso in 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) 
} 

Questo sembra eccessivamente ripetitivo. Ho provato

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

ma Scala non lascerò che mi legano e ad entrambi i tipi - abbastanza giusto. Nel gestore, ho solo bisogno di trattare e come se fosse di tipo Exception, ma voglio solo abbinare in primo luogo se è una di quelle classi specifiche. Qualcosa come avere una condizione dopo il tipo abbinato, come:

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

che non è, ovviamente, la sintassi giusta, ma si spera di vedere quello che voglio dire. E 'possibile una cosa del genere?

risposta

24

Non è possibile introdurre collegamenti all'interno di alternative di modello (PatternA | PatternB). Ma puoi associare un nome al risultato di Pattern Alternative con un Pattern Binder (name @ Pattern).

try { 
    < ... some JSON parsing code .. > 
} catch { 
    case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e) 
} 
8

Si potrebbe utilizzare i nuovi costrutti 2.8 controllo:

def foo = //JSON parsing code 

import util.control.Exception._ 
handling(classOf[ClassCastException], classOf[JSONException]) by (t => throw new ParseException(t)) apply foo 

(. C'è probabilmente un errore in là non riesco a trovare un REPL per la jabscreen.)

+0

Ecco un REPL: http://www.simplyscala.com/2.8 :) – retronym

+0

Non è proprio il Ruby, vero? –

+0

buona risposta, anche se sono bloccato su 2.7 per ora - che avrei dovuto specificare; Ho aggiornato la domanda per riflettere questo ora. – gfxmonk

Problemi correlati