web-dev-qa-db-fra.com

Renommage des exceptions dans Java sans perdre la trace de la pile

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

388
ripper234
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.

520
Brian Agnew

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.
    ...
}
81
Markus Lausberg

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);
}
71
Olvagor

Dans Java, c'est presque pareil:

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}
22
alves

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.

13
David M

quelque chose comme ça

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}
6
Gweg
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 .

5
Daniel

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); }

1
Sindre