web-dev-qa-db-fra.com

Comment vérifiez-vous à la fois le type de l'exception ainsi que le type de l'exception imbriquée?

Supposons que j'atteigne une exception de type AppException mais je veux seulement effectuer certaines actions à cette exception s'il a une exception imbriquée du type StreamException.

if (e instanceof AppException)
{
    // only handle exception if it contains a
    // nested exception of type 'StreamException'

Comment puis-je vérifier pour une nichée StreamException?

19
Timothy

Faire: if (e instanceof AppException and e.getCause() instanceof StreamException).

21
Marcelo

Peut-être au lieu d'examiner la cause que vous pourriez essayer de sous-classement d'appexception à des fins spécifiques.

par exemple.

class StreamException extends AppException {}

try {
    throw new StreamException();
} catch (StreamException e) {
   // treat specifically
} catch (AppException e) {
   // treat generically
   // This will not catch StreamException as it has already been handled 
   // by the previous catch statement.
}

Vous pouvez trouver ce modèle d'autre où dans Java aussi. L'un est un exemple IOException . C'est la superclasse pour de nombreux types d'IOException, y compris, mais pas limité à EOFException , FilenotfoundException et inconnuHostException.

5
Dunes

Exceptions d'Apache (org.Apache.commons.lang3.exception.ExceptionUtils) est une très grande collection d'utilitaires d'inspection et de manutention des exceptions. Inclus est la méthode hasCause que vous pourriez utiliser.

if (e instanceof AppException && ExceptionUtils.hasCause(ex, StreamException.class)) {
  ...
}

La bonne chose à propos de cette méthode est qu'il va explorer si votre cause est n'importe où dans la trace de la pile d'exception non seulement la cause immédiate.

Notez que hasCause vérifie également la transmission à l'exception, si vous souhaitez simplement vérifier si votre exception elle-même est d'un type ou de l'une de ses exceptions enveloppées dans la chaîne.

0
crowmagnumb