En C #, je peux utiliser l'instruction throw;
pour réexaminer une exception tout en préservant la trace de la pile:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Existe-t-il quelque chose comme ceci dans Java (qui ne perd pas la trace de la pile d'origine)?
catch (WhateverException e) {
throw e;
}
reviendra simplement à l'exception que vous avez capturée (évidemment, la méthode environnante doit permettre cela via sa signature, etc.). L'exception maintiendra la trace de la pile d'origine.
Je préférerais:
try
{
...
}
catch (FooException fe){
throw fe;
}
catch (Exception e)
{
// Note: don't catch all exceptions like this unless you know what you
// are doing.
...
}
Vous pouvez également encapsuler l'exception dans une autre exception ET conserver la trace de la pile d'origine en transmettant l'exception en tant que paramètre cause comme paramètre cause:
try
{
...
}
catch (Exception e)
{
throw new YourOwnException(e);
}
Dans Java, c'est presque pareil:
try
{
...
}
catch (Exception e)
{
if (e instanceof FooException)
throw e;
}
En Java, vous lancez simplement l'exception que vous avez interceptée, donc throw e
plutôt que simplement throw
. Java maintient la trace de la pile.
quelque chose comme ça
try
{
...
}
catch (FooException e)
{
throw e;
}
catch (Exception e)
{
...
}
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;
}
}
Ceci est un exemple concret où la méthode jette un IOException
. La final
signifie que t
ne peut contenir qu'une exception émise par le bloc try. Des ressources de lecture supplémentaires peuvent être trouvées ici et ici .
La trace de pile est conservée si vous intégrez l’excursion capturée dans une autre exception (pour fournir plus d’informations) ou si vous ne faites que redistribuer l’exception capturée.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }