java - tipos - ¿Es posible capturar todas las excepciones excepto las excepciones de tiempo de ejecución?
tipos de excepciones en java netbeans (3)
Podrías hacer lo siguiente:
try {
methodThrowingALotOfDifferentExceptions();
} catch(RuntimeException ex) {
throw ex;
} catch(Exception ex) {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}
Tengo una declaración que arroja un montón de excepciones comprobadas. Puedo agregar todos los bloques de captura para todos ellos de esta manera:
try {
methodThrowingALotOfDifferentExceptions();
} catch(IOException ex) {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
} catch(ClassCastException ex) {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
} catch...
No me gusta esto porque todos se manejan de la misma manera, por lo que hay una especie de duplicación de código y también hay mucho código para escribir. En su lugar podría atrapar la Exception
:
try {
methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}
Eso estaría bien, excepto que quiero que todas las excepciones de tiempo de ejecución sean desechadas sin ser atrapadas. Hay alguna solución para esto? Estaba pensando que alguna declaración genérica inteligente del tipo de excepción a ser capturada podría hacer el truco (o tal vez no).
Puedes intentar algo como esto, básicamente para atrapar todo y luego volver a lanzar la RuntimeException
si es una instancia de esa clase ...
try {
methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
if (ex instanceof RuntimeException){
throw ex;
}
else {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}
}
Al ver que esto podría ser complicado escribir una y otra vez (y malo para el mantenimiento), probablemente movería el código a una clase diferente, algo como esto ...
public class CheckException {
public static void check(Exception ex, String message) throws Exception{
if (ex instanceof RuntimeException){
throw ex;
}
else {
throw new MyCustomInitializationException(message, ex);
}
}
}
Y utilízalo en tu código como este ...
try {
methodThrowingALotOfDifferentExceptions();
} catch(Exception ex) {
CheckException.check(ex,"Class Resolver could not be initialized.");
}
Observando que pasamos el message
para que podamos personalizar nuestra MyCustomInitializationException
.
Si puedes usar Java 7, puedes usar un Multi-Catch :
try {
methodThrowingALotOfDifferentExceptions();
} catch(IOException|ClassCastException|... ex) {
throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
}