try tipos error catch java exception try-catch

java - tipos - ¿Volver del método, en el bloque "intentar" o después del bloque "atrapar"?



try catch java 8 (5)

Considera estos casos en los que no estás devolviendo una expresión constante:

Caso 1:

public static Val test() throws Exception { try { return doSomething(); } catch (Exception e) { throw new Exception("No!"); } // Unreachable code goes here }

Caso 2:

public static Val test() throws Exception { Val toReturn = null; try { toReturn = doSomething(); } catch (Exception e) { throw new Exception("No!"); } return toReturn; }

Preferiría el primero. El segundo es más detallado y puede causar cierta confusión al depurar.

Si test() devuelve incorrectamente un null , y ve que el toReturn se inicializa a null , puede pensar que el problema está en test() (especialmente cuando test() no es solo un ejemplo simple como este).

Aunque solo puede devolver null si doSomething devuelve null . Pero eso podría ser difícil de ver de un vistazo.

Entonces podría argumentar que, por razones de coherencia, es mejor usar siempre la primera forma.

¿Hay alguna diferencia entre seguir dos métodos?

¿Cuál es preferible y por qué?

Prg1:

public static boolean test() throws Exception { try { doSomething(); return true; } catch (Exception e) { throw new Exception("No!"); } }

Prg2:

public static boolean test() throws Exception { try { doSomething(); } catch (Exception e) { throw new Exception("No!"); } return true; }


No hay diferencia funcional. Ambos programas se comportan de la misma manera. Es solo una cuestión de codificar estilo y gusto personal.

Como una buena práctica, es mejor tener una única declaración de devolución por método, al final del método, en lugar de en el medio. En el caso de bloques de código largos, este estilo hace que el código sea más legible y más mantenible en el futuro cuando el (autor original o alguien más) tenga que realizar cambios en el código.

Por lo tanto, el primero se considera mejor desde el punto de vista de la buena práctica.


No hay diferencia, pero el primer Prg1 es más rápido que el Prg2.


No, no hay diferencia entre ambos métodos. Devolverá el valor verdadero en ambos casos de manera efectiva al reanudar el flujo del programa tan pronto como se maneje una excepción. Se accederá a la captura solo cuando se produzca una excepción.


Supongo que esta es una pregunta general. De lo contrario, podría comentar otros aspectos de su (s) método (s).

Creo que en el caso o pequeños métodos como estos no importa realmente. El método es lo suficientemente corto como para entender de inmediato lo que está sucediendo, lo que está relacionado con qué, etc.

Sin embargo, en el caso de métodos más largos, el flujo es mucho más fácil de seguir en el primer ejemplo. En mi opinion Mantiene unido código relacionado y escenarios relacionados. Cuando está leyendo el método, el bloque catch no rompe el flujo de ejecución normal, lo que lo hace más obvio y "fluido".

public static boolean test() throws Exception { try { doSomething(); return true; } catch (Exception e) { throw new Exception("No!"); } }

Pero no voy a generalizar esto para todos los métodos; se trata del contexto.