2009-10-30 6 views
2

Expérimenter avec Scala ... J'essaie de définir quelque chose d'analogue au hack "@" en PHP (ce qui signifie, ignorer toute exception dans l'instruction suivante).Une meilleure syntaxe pour la fonction anonyme de Scala?

j'ai réussi à obtenir une définition qui fonctionne:

 
    def ignoreException(f:() => Unit) = { 
     try { 
     f(); 
     } 
     catch { 
     case e: Exception => println("exception ignored: " + e); 
     } 
    } 

Et l'utiliser comme ceci:

 
ignoreException(() => { someExceptionThrowingCodeHere() }); 

Maintenant, voici ma question ... Y at-il de toute façon je peux simplifier l'utilisation et se débarrasser de la() =>, et peut-être même les crochets?

En fin de compte, j'aimerais l'usage d'être quelque chose comme ceci:

 
`@` { someExceptionThrowingCodeHere(); } 

Répondre

12

@ est réservé dans Scala (pour la correspondance de modèle), mais accepteriez-vous @@?

scala> def @@(block: => Unit): Unit = try { 
    block 
} catch { 
    case e => printf("Exception ignored: %s%n", e) 
} 
$at$at: (=> Unit)Unit 

scala> @@ { 
    println("before exception") 
    throw new RuntimeException() 
    println("after exception") 
} 
before exception 
Exception ignored: java.lang.RuntimeException 

Je ne suis pas convaincu que c'est une bonne idée, mais ☺

6

Vous ne devez pas utiliser une fonction comme paramètre, un paramètre « par nom » fera:

def ignoreException(f: =>Unit) = { 
    try { 
    f 
    } 
    catch { 
    case e: Exception => println("exception ignored: " + e) 
    } 
} 

ignoreException(someExceptionThrowingCodeHere()) 

Eric.

+1

Notez le code d'appel pourrait être écrit dans le même style que Alex R a montré comme un exemple d'utilisation: ignoreException {bla(); blabla() } –

Questions connexes