En Java, quiero hacer algo como esto:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
...en vez de:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
¿Hay alguna forma de hacer esto?
java
exception
try-catch
multi-catch
froadie
fuente
fuente
bitwise or
(|
)? ¿Por qué no usar una coma o el operador que tiene un significado más similar, ellogical or
(||
)?No exactamente antes de Java 7, pero haría algo como esto:
Java 6 y antes
Java 7
fuente
exc.getCause()
. Como nota al margen, Robert C. Martin (entre otros) recomienda utilizar excepciones no verificadas (el compilador no tiene idea de qué tipo de excepción se lanzará desde allí); consulte el Capítulo 7: Manejo de errores en su libro Código limpio .throw exc
lugar dethrow new RuntimeException(exc)
?Dentro de Java 7 puede definir múltiples cláusulas catch como:
fuente
Si hay una jerarquía de excepciones, puede usar la clase base para capturar todas las subclases de excepciones. En el caso degenerado, puede capturar todas las excepciones de Java con:
En un caso más común, si RepositoryException es la clase base y PathNotFoundException es una clase derivada, entonces:
El código anterior capturará RepositoryException y PathNotFoundException para un tipo de manejo de excepciones y todas las demás excepciones se agrupan. Desde Java 7, según la respuesta de @ OscarRyz anterior:
fuente
No, uno por cliente.
Puede capturar una superclase, como java.lang.Exception, siempre que realice la misma acción en todos los casos.
Pero esa podría no ser la mejor práctica. Solo debe detectar una excepción cuando tiene una estrategia para manejarlo realmente, y registrar y volver a lanzar no es "manejarlo". Si no tiene una acción correctiva, es mejor agregarla a la firma del método y dejar que brote a alguien que pueda manejar la situación.
fuente
Una alternativa más limpia (pero menos detallada, y tal vez no tan preferida) a la respuesta del usuario 454322 en Java 6 (es decir, Android) sería capturar todos
Exception
los correos electrónicos y volver a lanzarlosRuntimeException
. Esto no funcionaría si planea capturar otros tipos de excepciones más arriba en la pila (a menos que también las vuelva a lanzar), pero efectivamente capturará todas las excepciones marcadas .Por ejemplo:
Dicho esto, para verbosidad, podría ser mejor establecer una variable booleana o alguna otra y, en función de eso, ejecutar algún código después del bloque try-catch.
fuente
En pre-7, ¿qué tal:
fuente
caught
en unfinally
bloque?Si. Aquí está la forma de usar el separador de tubería (|),
fuente
Para kotlin, no es posible por ahora, pero han considerado agregarlo: Fuente
Pero por ahora, solo un pequeño truco:
fuente
Capture la excepción que resulta ser una clase principal en la jerarquía de excepciones. Esto es, por supuesto, una mala práctica . En su caso, la excepción principal común es la clase Excepción, y capturar cualquier excepción que sea una instancia de Excepción es, de hecho, una mala práctica: las excepciones como NullPointerException suelen ser errores de programación y, por lo general, deben resolverse comprobando valores nulos.
fuente