2010-07-11 4 views
14

J'ai le code suivant:Correspondance (et liaison) de deux classes d'exception dans une instruction case dans 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) 
} 

Cela semble trop répétitif. J'ai essayé

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

mais Scala ne me laisse pas e lie aux deux types - assez juste. Dans le gestionnaire, j'ai seulement besoin de traiter e comme s'il était de type Exception, mais je veux seulement correspondre en premier lieu si c'est l'une de ces classes spécifiques. Quelque chose comme ayant une condition après le type adapté, comme:

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

C'est évidemment pas la bonne syntaxe, mais nous espérons que vous voyez ce que je veux dire. Une telle chose est possible?

Répondre

24

Vous ne pouvez pas introduire de liaisons dans Pattern Alternatives (PatternA | PatternB). Mais vous pouvez lier un nom au résultat de Pattern Alternatives avec un classeur de modèle (name @ Pattern).

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

Vous pouvez utiliser les nouveaux 2.8 constructions de contrôle:

def foo = //JSON parsing code 

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

(. Il y a probablement une erreur là-bas je ne peux pas trouver un REPL pour le jabscreen.)

+0

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

+0

Ce n'est pas tout à fait le Ruby, n'est-ce pas? –

+0

bonne réponse, même si je suis coincé sur 2.7 pour l'instant - que j'aurais dû préciser; J'ai mis à jour la question pour refléter cela maintenant. – gfxmonk

Questions connexes