2011-07-16 12 views
34

Estoy intentando lanzar una excepción personalizada.Throw Custom Exception

La implementación de la clase de excepción personalizada es:

case class customException(smth:String) extends Exception 

En mi código Envolví una pieza de código que estoy seguro lanza una excepción con el try/catch para tirar mi customException.

try{ 
    val stateCapitals = Map(
     "Alabama" -> "Montgomery", 
     "Alaska" -> "Juneau", 
     "Wyoming" -> "Cheyenne") 

    println("Alabama: " + stateCapitals.get("AlabamaA").get) 
} 
catch{ 
    case x:Exception=>throw classOf[CustomException] 
} 

tengo un error de compilación que dice:

 found : java.lang.Class[CustomException] 
[INFO] required: java.lang.Throwable 
[INFO]  case x:Exception=>throw classOf[CustomException] 

¿Cómo podría tirar mi propia excepción personalizada en este caso? Más tarde estoy comprobando si la excepción arrojada es de un tipo [x] para hacer algo específico.

Respuesta

48

No está lanzando una excepción, sino la clase de una excepción (basta con leer el mensaje de error del compilador ...). Tienes que lanzar una instancia de excepción.

case x:Exception => throw new CustomException("whatever") 
+12

En el caso de las clases de casos, no necesitan que el 'new'. –

+1

Esa es una de las preguntas más tontas que jamás haya hecho. El problema que solía lanzar "CustomException" como mencionaste b4 Uso classOf pero estaba obteniendo el mismo error que mencioné. Lo que más me interesa de tu código es "lo que sea" ... Olvidé pasar el parámetro del constructor. Perdón por ser ....... "lo que sea" :) – Echo

+1

@Kim: De hecho. Solo quería insistir en la creación de instancias. – paradigmatic

23

Sería también de utilidad para cambiar la definición de la clase de excepción de la siguiente manera:

case class customException(smth:String) extends Exception(smth) 
+2

¿Puedes explicar por qué? – alex88

+3

Porque al no proporcionar un argumento de "mensaje" al constructor de la clase Exception invocas de manera efectiva el constructor predeterminado (no-args), y de esta manera "pierdes" el mensaje. Puede ser una elección de diseño, donde solo un nombre de clase es suficiente para identificar el error, pero en la mayoría de los casos prácticos omitir el constructor Excepción (mensaje de cadena) en este caso sería un descuido. – Vlad