salida - Volver a generar excepciones en Java sin perder el seguimiento de pila
propagacion de excepciones en java (8)
En C #, puedo usar el throw;
declaración para volver a emitir una excepción a la vez que se conserva el seguimiento de la pila:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
¿Hay algo como esto en Java ( que no pierde el rastro de pila original )?
El seguimiento de la pila se conserva si envuelve la extracción capturada en otra excepción (para proporcionar más información) o si simplemente vuelve a lanzar la extracción capturada.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
En Java es casi lo mismo:
try
{
...
}
catch (Exception e)
{
if (e instanceof FooException)
throw e;
}
En Java, solo lanzas la excepción que atrapaste, así que throw e
lugar de solo throw
. Java mantiene el seguimiento de la pila.
También puede envolver la excepción en otra Y mantener el seguimiento de la pila original pasando la Excepción como un Throwable como el parámetro de causa:
try
{
...
}
catch (Exception e)
{
throw new YourOwnException(e);
}
Yo preferiría:
try
{
...
}
catch (FooException fe){
throw fe;
}
catch (Exception e)
{
...
}
algo como esto
try
{
...
}
catch (FooException e)
{
throw e;
}
catch (Exception e)
{
...
}
catch (WhateverException e) {
throw e;
}
simplemente volverá a generar la excepción que haya capturado (obviamente, el método circundante tiene que permitirlo a través de su firma, etc.). La excepción mantendrá la traza de pila original.
public int read(byte[] a) throws IOException {
try {
return in.read(a);
} catch (final Throwable t) {
/* can do something here, like in=null; */
throw t;
}
}
Este es un ejemplo concreto en el que el método lanza una IOException
. Los medios final
t
solo pueden contener una excepción lanzada desde el bloque try. Material de lectura adicional se puede encontrar here y here .