Respuesta

118

puede enlazar todo el patrón a una variable de la siguiente manera:

try { 
    throw new java.io.IOException("no such file") 
} catch { 
    // prints out "java.io.IOException: no such file" 
    case e @ (_ : RuntimeException | _ : java.io.IOException) => println(e) 
} 

Ver the Scala Language Specification page 118 paragraph 8.1.11 llamadas alternativas del patrón.

25

Como usted tiene acceso al patrón completo las capacidades de Scala a juego en la cláusula catch, se puede hacer mucho:

try { 
    throw new IOException("no such file") 
} catch { 
    case _ : SQLException | _ : IOException => println("Resource failure") 
    case e => println("Other failure"); 
} 

Tenga en cuenta que si necesita escribir el mismo tiempo y el tiempo manipuladores de nuevo puede crear su propia estructura de control para que:

def onFilesAndDb(code: => Unit) { 
    try { 
    code 
    } catch { 
    your handling code 
    } 
} 

Algunos de estos métodos están disponibles en el objeto scala.util.control.Exceptions. fallar, failAsValue, el manejo puede ser justo lo que necesita

Editar: Al contrario de lo que se dice a continuación, los patrones alternativos pueden vincularse, por lo que la solución propuesta es innecesariamente compleja. Consulte la solución de @agilesteel

Desafortunadamente, con esta solución, no tiene acceso a la excepción donde utiliza los patrones alternativos. Que yo sepa, no se puede vincular a un patrón alternativo con el caso e @ (_ : SqlException | _ : IOException). Así que si usted necesita el acceso a la excepción, usted tiene que igualadores de nido:

try { 
    throw new RuntimeException("be careful") 
} catch { 
    case e : RuntimeException => e match { 
    case _ : NullPointerException | _ : IllegalArgumentException => 
     println("Basic exception " + e) 
    case a: IndexOutOfBoundsException => 
     println("Arrray access " + a) 
    case _ => println("Less common exception " + e) 
    } 
    case _ => println("Not a runtime exception") 
} 
+0

Interesante, no he visto alternativas de patrones antes. Creo que no están cubiertos en [PinS] (http://www.artima.com/shop/programming_in_scala_2ed). – kassens

+1

La vinculación de un patrón funciona alternativamente, y es especialmente útil en este caso. La variable enlazada incluso obtiene como tipo los supertipos comunes más específicos de las alternativas. Anidar manifestantes es innecesario. Renunciaré a su respuesta si la actualiza diciendo eso. –

+0

@ Jean-Philippe: ¡¡Excelente !! Lo intenté antes de responder y no pude hacer ese trabajo. Comprobando la especificación probablemente demasiado rápido, pensé que decía lo mismo (en la página 113, la alternativa es Patrón y solo puede enlazar en Patrón3). ¿Cuál es la sintaxis? –

14

También puede utilizar scala.util.control.Exception:

import scala.util.control.Exception._ 
import java.io.IOException 

handling(classOf[RuntimeException], classOf[IOException]) by println apply { 
    throw new IOException("foo") 
} 

Este ejemplo específico podría no ser el mejor ejemplo para ilustrar cómo se puede usar, pero me resulta muy útil en muchas ocasiones.

Cuestiones relacionadas