exception scala exception-handling pattern-matching try-catch

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)



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.