¿Cómo atrapar múltiples excepciones a la vez en Scala? ¿Hay una manera mejor que en C#: Catch multiple exceptions at once?Captura de múltiples excepciones a la vez en Scala
Respuesta
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.
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")
}
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.
- 1. asignar múltiples variables a la vez en Scala
- 2. Scala Regex Captura de múltiples bloques
- 3. Captura de excepciones específicas frente a genéricas en C#
- 4. Java: la captura de excepciones específicas
- 5. Excepciones de lanzamiento y captura
- 6. Prevención de excepciones contra excepciones de captura en Java
- 7. Múltiples transacciones de PayPal a la vez
- 8. Excepciones en PHP - Prueba/captura o set_exception_handler?
- 9. Captura de excepciones en plantillas de django
- 10. Captura de todas las excepciones en Python
- 11. la gestión de excepciones intento de captura en el interior de captura
- 12. Orden de captura de excepciones en Java
- 13. ¿Puedo importar desde múltiples paquetes todos a la vez en Scala?
- 14. Captura de excepciones en el constructor
- 15. Captura de excepciones controladas en C#
- 16. Reemplazar múltiples subcadenas a la vez
- 17. Obteniendo múltiples mensajes IMAP a la vez
- 18. Manejo de múltiples excepciones
- 19. La captura de números de línea en excepciones rubí
- 20. Captura de excepciones no controladas en subprocesos secundarios en WPF
- 21. ¿Cómo salir de múltiples bucles a la vez en C#?
- 22. captura de excepciones, añadir datos y volver a lanzar que
- 23. Captura de excepciones lanzadas desde DLL
- 24. código Scala captura de confusión
- 25. Captura de excepciones de puntero nulo
- 26. A nivel mundial Entrar captura de excepciones e
- 27. ¿Puede jQueryCycle mostrar imágenes múltiples a la vez, pero deslice una a la vez?
- 28. En Emacs, ¿cómo edito múltiples puntos a la vez?
- 29. Publicar artefactos hiedra a múltiples resolutores a la vez
- 30. ¿Cómo puedo aplicar estilos a múltiples clases a la vez?
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
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. –
@ 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? –