En C #, puedo usar la throw;
instrucción para volver a generar una excepción mientras 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 original de la pila )?
Throwable
s no se modifican arrojándolos. Para actualizar el seguimiento de la pila, debe llamarfillInStackTrace()
. Convenientemente, este método se llama en el constructor de aThrowable
.throw e;
perderá el stacktrace. Pero no en Java.Respuestas:
simplemente volverá a lanzar la excepción que ha detectado (obviamente, el método circundante debe permitir esto a través de su firma, etc.) La excepción mantendrá el seguimiento de la pila original.
fuente
catch(Exception e) { throw e; }
eso no se manejará. Si ustedcatch(InterruptedException ie) { throw ie; }
será manejado. Como regla general, no lo hagas, ¡catch(Exception e)
esto no es pokemon, y no queremos atraparlos a todos!Yo preferiría:
fuente
Exception
no suele ser lo correcto, en la mayoría de los casos (pero no en todos).También puede envolver la excepción en otro Y mantener el seguimiento de la pila original pasando la Excepción como Throwable como parámetro de causa:
fuente
throw new YourOwnException("Error while trying to ....", e);
En Java es casi lo mismo:
fuente
En Java, que acaba de lanzar la excepción que pillan, por lo que
throw e
en lugar de sólothrow
. Java mantiene el seguimiento de la pila.fuente
algo como esto
fuente
Este es un ejemplo concreto donde el método arroja un
IOException
. Losfinal
mediost
solo pueden contener una excepción lanzada desde el bloque try. Material de lectura adicional se puede encontrar aquí y aquí .fuente
El seguimiento de pila se conserva si ajusta la excedencia capturada en otra excepción (para proporcionar más información) o si simplemente vuelve a lanzar la excedencia atrapada.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
fuente
Estaba teniendo una situación similar en la que mi código potencialmente arroja una serie de excepciones diferentes que solo quería volver a lanzar. La solución descrita anteriormente no funcionaba para mí, porque Eclipse me dijo que eso
throw e;
lleva a una excepción sin control, así que acabo de hacer esto:Trabajó para mi....:)
fuente