Esto puede parecer una pregunta de programación 101 y pensé que sabía la respuesta, pero ahora necesito verificarlo dos veces. En el siguiente código, ¿la excepción lanzada en el primer bloque de captura será capturada por el bloque de captura de excepción general a continuación?
try {
// Do something
} catch(IOException e) {
throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
// Will the ApplicationException be caught here?
}
Siempre pensé que la respuesta sería no, pero ahora tengo un comportamiento extraño que podría ser causado por esto. La respuesta es probablemente la misma para la mayoría de los idiomas, pero estoy trabajando en Java.
Respuestas:
No, ya que lo nuevo
throw
no está en eltry
bloque directamente.fuente
RuntimeException
se arroja uncatch
bloque, no habrá error de compilación.catch
cláusula de excepción principal aparece antes que unacatch
cláusula de excepción secundaria . Tengo entendido que Java no permite esto, y está atrapado en el momento de la compilación.No. Es muy fácil de verificar.
Debería imprimir:
Técnicamente, podría haber sido un error del compilador, un comportamiento no especificado dependiente de la implementación o algo así. Sin embargo, el JLS está bastante bien definido y los compiladores son lo suficientemente buenos para este tipo de cosas simples (el caso de los genéricos puede ser un asunto diferente).
También tenga en cuenta que si intercambia los dos bloques catch, no se compilará. La segunda captura sería completamente inalcanzable.
Tenga en cuenta que el bloque finalmente siempre se ejecuta incluso si se ejecuta un bloque catch (que no sean casos tontos, como bucles infinitos, adjuntando a través de la interfaz de herramientas y matando el hilo, reescribiendo bytecode, etc.).
fuente
finally
es, por supuesto, llamarSystem.exit
. :-Pfor(;;);
es más corto, contenido en el lenguaje, no introduce muchos efectos secundarios y, para mí, más obvio.System.exit
es más amigable con la CPU! : -O Pero sí, está bien, claramente este es un criterio subjetivo. Además, no sabía que eras un jugador de código. ;-)La especificación del lenguaje Java dice en la sección 14.19.1:
Referencia: http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#24134
En otras palabras, la primera captura adjunta que puede manejar la excepción sí lo hace, y si se arroja una excepción de esa captura, eso no está dentro del alcance de ninguna otra captura para el intento original, por lo que no intentarán manejarla.
Una cosa relacionada y confusa de saber es que en una estructura try- [catch] -finally, un bloque finalmente puede lanzar una excepción y si es así, se pierde cualquier excepción lanzada por el bloque try o catch. Eso puede ser confuso la primera vez que lo ves.
fuente
try
-with-resources. Luego, sitry
Yfinally
ambos lanzan,finally
se suprime, pero también se AGREGA a excepción detry
. Si tambiéncatch
lanza, no tiene suerte, a menos que lo maneje usted mismo a través de 'addSuppressed' y agregue latry
excepción, entonces tiene los tres.Si desea lanzar una excepción desde el bloque catch, debe informar su método / clase / etc. que necesita lanzar dicha excepción. Al igual que:
Y ahora tu compilador no te gritará :)
fuente
No, como dijo Chris Jester-Young, se lanzará al próximo try-catch en la jerarquía.
fuente
Como se dijo anteriormente ...
Agregaría que si tiene problemas para ver lo que está sucediendo, si no puede reproducir el problema en el depurador, puede agregar un rastro antes de volver a lanzar la nueva excepción (con el buen sistema anterior .out.println en el peor de los casos, con un buen sistema de registro como log4j).
fuente
No será atrapado por el segundo bloque de captura. Cada excepción se captura solo cuando está dentro de un bloque de prueba. Sin embargo, puede anidar intentos (no es una buena idea en general):
fuente
No, dado que todas las capturas se refieren al mismo bloque try, por lo que lanzar desde dentro de un bloque catch sería atrapado por un bloque try cerrado (probablemente en el método que llamó a este)
fuente
La publicación anterior pero la variable "e" debe ser única:
fuente