¿Es posible en Java capturar dos excepciones en el mismo bloque catch? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Necesito capturar dos excepciones porque requieren la misma lógica de manejo. Me gustaría hacer algo como:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

¿Es posible evitar duplicar el código del controlador en cada bloque catch?

Author: John Watts, 2012-06-26

6 answers

Java 7 y posteriores

Se admiten capturas de excepción múltiple, comenzando en Java 7.

La sintaxis es:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

El tipo estático de ex es el supertipo común más especializado de las excepciones listadas. Hay una buena característica donde si repensamos ex en la captura, el compilador sabe que solo una de las excepciones listadas puede ser lanzada.


Java 6 y anteriores

Antes de Java 7, hay formas de manejar este problema, pero tienden a ser poco elegantes y a tener limitaciones.

Enfoque #1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

Esto se complica si el controlador de excepciones necesita acceder a variables locales declaradas antes de try. Y si el método handler necesita repensar la excepción (y está marcada), entonces se encuentra con serios problemas con la firma. Específicamente, handleException tiene que ser declarado como lanzando SuperException ... lo que potencialmente significa que tiene que cambiar la firma del método de inclusión, y así en.

Enfoque # 2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

Una vez más, tenemos un problema potencial con las firmas.

Enfoque # 3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

Si omites la parte else (por ejemplo, porque no hay otros subtipos de SuperException en este momento), el código se vuelve más frágil. Si la jerarquía de excepciones se reorganiza, este manejador sin un else puede terminar comiendo silenciosamente excepciones!

 181
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-17 12:03:07

Java

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

Documentación:

Cada bloque catch es un manejador de excepciones y maneja el tipo de excepción indicada por su argumento. El argumento type, ExceptionType, declara el tipo de excepción que el manejador puede manejar y debe ser el nombre de una clase que hereda de la clase lanzable.

Para Java 7 puede tener múltiples excepciones capturadas en un bloque de captura:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

Documentación:

En Java SE 7 y posteriores, un solo bloque catch puede manejar más de uno tipo de excepción. Esta característica puede reducir la duplicación de código y disminuir la tentación de coger una excepción demasiado amplia.

Referencia: http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

 33
Author: Francisco Spaeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 22:30:16

Si no está en java 7, puede extraer su manejo de excepciones a un método, de esa manera puede al menos minimizar la duplicación

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
 12
Author: jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-26 16:04:54

Para Java

try {
    // common logic to handle both exceptions
} catch (Exception ex) {
    if (ex instanceof Exception1 || ex instanceof Exception2) {

    }
    else {
        throw ex;
        // or if you don't want to have to declare Exception use
        // throw new RuntimeException(ex);
    }
}

Editado y reemplazado Lanzable con Excepción.

 2
Author: Sarel Botha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 18:22:20

Antes del lanzamiento de Java SE 7 éramos habituales de escribir código con múltiples sentencias catch asociadas a un bloque try. Un Ejemplo muy básico:

 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}

Pero ahora con la última actualización en Java, en lugar de escribir varias sentencias catch podemos manejar varias excepciones dentro de una sola cláusula catch. Aquí hay un ejemplo que muestra cómo se puede lograr esta característica.

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}

Así que múltiples excepciones en una sola cláusula de captura no solo simplifica el código, sino que también reduce redundancia de código. Encontré este artículo que explica esta característica muy bien junto con su implementación. Mejorado y Mejor Manejo de Excepciones de Java 7 Esto también puede ayudarte.

 2
Author: Saurab Parakh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 19:56:21

Http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html cubre la captura de múltiples excepciones en el mismo bloque.

 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}

Estoy haciendo tarjetas de estudio, y este hilo fue útil, solo quería poner mis dos centavos.

 1
Author: Eli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-08 18:15:52