En C #, je peux utiliser l' throw;
instruction pour renvoyer une exception tout en préservant la trace de la pile:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Y a-t-il quelque chose comme ça en Java ( qui ne perd pas la trace de pile d'origine )?
Throwable
s ne sont pas modifiés en les jetant. Pour mettre à jour la trace de pile, vous devez appelerfillInStackTrace()
. Idéalement, cette méthode est appelée dans le constructeur de aThrowable
.throw e;
perdra la trace de pile. Mais pas en Java.Réponses:
renverra simplement l'exception que vous avez interceptée (la méthode environnante doit évidemment le permettre via sa signature, etc.). L'exception conservera la trace de pile d'origine.
la source
catch(Exception e) { throw e; }
cela ne sera pas géré. Si vous,catch(InterruptedException ie) { throw ie; }
il sera traité. En règle générale, ne le faites pascatch(Exception e)
- ce n'est pas un pokemon, et nous ne voulons pas tous les attraper!Je préférerais:
la source
Exception
n'est généralement pas la bonne chose à faire, dans la plupart (mais pas tous) les cas.Vous pouvez également envelopper l'exception dans une autre ET conserver la trace de pile d'origine en passant l'exception comme Throwable comme paramètre de cause:
la source
throw new YourOwnException("Error while trying to ....", e);
En Java, c'est presque la même chose:
la source
En Java, vous lancez simplement l'exception que vous avez interceptée,
throw e
plutôt que justethrow
. Java conserve la trace de la pile.la source
quelque chose comme ça
la source
Ceci est un exemple concret où la méthode lance un
IOException
. Lefinal
moyent
ne peut contenir qu'une exception levée depuis le bloc try. Des documents de lecture supplémentaires peuvent être trouvés ici et ici .la source
La trace de pile est conservée si vous encapsulez l'excétion capturée dans une autre exception (pour fournir plus d'informations) ou si vous relancez simplement l'excision capturée.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
la source
Je venais juste d'avoir une situation similaire dans laquelle mon code lève potentiellement un certain nombre d'exceptions différentes que je voulais simplement renverser. La solution décrite ci-dessus ne fonctionnait pas pour moi, car Eclipse m'a dit que cela
throw e;
conduisait à une exception non gérée, alors je viens de faire ceci:A travaillé pour moi .... :)
la source