exception - Atrapando mĂșltiples excepciones a la vez en Scala
exception-handling pattern-matching (4)
Como tiene acceso a las capacidades completas de coincidencia de patrones de Scala en la cláusula catch, 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 los mismos controladores una y otra vez, puede crear su propia estructura de control para eso:
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 . falla, failAsValue, el manejo puede ser justo lo que necesita
Editar: Al contrario de lo que se dice a continuación, los patrones alternativos pueden estar limitados, por lo que la solución propuesta es innecesariamente compleja. Ver la solución de @agilesteel
Desafortunadamente, con esta solución, no tiene acceso a la excepción donde usa los patrones alternativos. Que yo sepa, no se puede vincular a un patrón alternativo con el caso e @ (_ : SqlException | _ : IOException)
. Por lo tanto, si necesita acceder a la excepción, debe anidar correspondencias:
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")
}
¿Cómo atrapar múltiples excepciones a la vez en Scala? ¿Hay una manera mejor que en C #: capturar múltiples excepciones a la vez?
Esta fue la única forma para mí, que pasó a través del sbt clean coverage test coverageReport
sin arrojar la desagradable excepción de análisis ...
try {
throw new CustomValidationException1(
CustomErrorCodeEnum.STUDIP_FAIL,
"could be throw new CustomValidationException2")
} catch {
case e
if (e.isInstanceOf[CustomValidationException1] || e
.isInstanceOf[CustomValidationException2]) => {
// run a common handling for the both custom exceptions
println(e.getMessage)
println(e.errorCode.toString) // an example of common behaviour
}
case e: Exception => {
println("Unknown error occurred while reading files!!!")
println(e.getMessage)
// obs not errorCode available ...
}
}
// ...
class CustomValidationException1(val errorCode: CustomErrorCodeEnum, val message: String)
class CustomValidationException2(val errorCode: CustomErrorCodeEnum, val message: String)
Puede vincular el patrón completo a una variable como esta:
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)
}
Consulte la Especificación de idioma de Scala página 118 párrafo 8.1.11 llamada Alternativas de patrón.
Mira Pattern Matching Unleashed para profundizar en la coincidencia de patrones en Scala.
También puede usar 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 puede usarlo, pero me parece bastante útil en muchas ocasiones.