La meilleure façon de vérifier si un certain type d'exception a été la cause (d'une cause, etc ...) dans un nested exception?
Je suis en train d'écrire quelques JUnit tests qui permettent de vérifier qu'une exception de type MyCustomException
est levée. Toutefois, cette exception est enveloppé dans d'autres exceptions, un certain nombre de fois, par exemple dans un InvocationTargetException, qui à son tour est enveloppé dans une RuntimeException.
Quelle est la meilleure façon de déterminer si MyCustomException en quelque sorte causé l'exception que j'ai fait attraper? Je voudrais faire quelque chose comme ceci (voir souligné):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Je voudrais éviter d'appeler getCause()
un peu de "couches" de profondeur, et similaire laide des solutions de rechange. Est-il plus agréable?
(Apparemment, le Printemps a NestedRuntimeException.contient du(de la Classe), qui fait ce que je veux, mais je ne suis pas à l'aide de Printemps.)
FERMÉ:
OK, je suppose que il n'y a vraiment pas de se déplacer à une méthode utilitaire 🙂 Merci à tous ceux qui ont répondu!
OriginalL'auteur Yang Meyer | 2009-03-04
Vous devez vous connecter pour publier un commentaire.
Pourquoi voudriez-vous éviter
getCause
. Vous pouvez, bien sûr, faites-vous une méthode pour effectuer la tâche, quelque chose comme:indexOfThrowable
de Patrick de répondre, en fait.Pas une boucle infinie - il faudrait rapide jeter
StackOverflowError
. Si vous avez une panne dans la causalité comme ça, alors vous avez plus de problèmes (probablement essayer de réutiliser des objets d'exception, même s'ils sont étrangement mutable).Un StackOverflowError alors, merci. Peu importe, ce n'est pas un problème avec le code que j'ai écrit; c'est un problème dans certaines bibliothèques communes, y compris certains pilotes Oracle jdbc. C'est un problème assez que Apache Commons choisi de le manipuler en
getRootCause
, Oracle a choisi de le manipuler en printStackTrace, et la Goyave considéré comme traitement de celle-ci Throwables. Mon commentaire était destiné à avertir de ceci, de ne pas recommander la meilleure façon de construire des Exceptions.Je suis déçu de bibliothèques qui ont fourni avec la prédestination des paradoxes. Intéressant l'OpenJDK
printStackTace
source fait une suggestion au sujet de la protection contre malveillants exceptions, mais ne parvient pas à plus d'un titre. P4 bug, je serais plus inquiet au sujet de la bibliothèque que d'essayer de traiter avec tous les possibles DoS bug. Le Code qui est sensible à ce genre de c'est omniprésente - utiliseequals
par exemple.OriginalL'auteur
Si vous utilisez Apache Commons Lang, alors vous pouvez utiliser les éléments suivants:
(1) Lorsque la cause doit être exactement du type spécifié
(2) Lorsque la cause doit être soit du type spécifié ou de ses sous-classe de type
OriginalL'auteur
Je ne pense pas que vous aurez aucun choix mais pour appeler à travers les couches de getCause. Si vous regardez le code source pour le Printemps NestedRuntimeException que vous évoquez, c'est la façon dont il est mis en œuvre.
OriginalL'auteur
L'Imitation est la forme la plus sincère de flatterie. Basé sur une inspection rapide de la source, c'est exactement ce que NestedRuntimeException n':
Mise en garde: Le ci-dessus est le code à compter du 4 Mars 2009 donc, si vous voulez vraiment savoir ce que le Printemps est en train de faire maintenant, vous devriez la recherche le code tel qu'il existe aujourd'hui, chaque fois que c'est).
OriginalL'auteur
Bien, je pense qu'il n'y a aucun moyen de le faire sans faire appel
getCause()
. Il vous pensez que c'est moche de mettre en œuvre un utilitaire classe pour ce faire:OriginalL'auteur
Vous pouvez le faire à l'aide de goyave:
OriginalL'auteur
Basé sur Patrick Boos réponse:
Si vous utilisez Apache Commons Lang 3 vous pouvez vérifier:
indexOfThrowable: Retourne le (de base zéro) indice de la première Throwable qui correspond à la classe spécifiée (exactement) à l'exception de la chaîne. Sous-classes de la classe spécifiée ne correspondent pas
ou
indexOfType: Retourne le (de base zéro) indice de la première Throwable qui correspond le spécifié classe ou sous-classe à l'exception de la chaîne. Sous-classes de la classe spécifiée ne correspondent
Exemple de plusieurs types avec Java 8:
OriginalL'auteur