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 )?

Throwables 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
Exceptionno 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 een 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. Losfinalmediostsolo 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