Attraper un générique exception en Java?
Nous utiliser JUnit 3 au travail et il n'y a pas de ExpectedException
annotation. Je voulais ajouter un utilitaire pour notre code pour conclure:
try {
someCode();
fail("some error message");
} catch (SomeSpecificExceptionType ex) {
}
J'ai donc essayé ceci:
public static class ExpectedExceptionUtility {
public static <T extends Exception> void checkForExpectedException(String message, ExpectedExceptionBlock<T> block) {
try {
block.exceptionThrowingCode();
fail(message);
} catch (T ex) {
}
}
}
Cependant, Java ne peut pas utiliser les génériques les types d'exception dans un bloc catch, je pense.
Comment puis-je faire quelque chose comme cela, le travail autour de la Java limitation?
Est-il un moyen de vérifier que le ex
variable est de type T
?
Twould semble que vous avez raison et c' pas capture génériques. Boiteux stackoverflow.com/questions/2444633/...
Flûte De Merde, Java. C'est juste encore un autre des nombreux obstacles que vous jetez dans notre chemin tout en essayant de faire le code de la moindre nettoyer à l'aide de Java 8 lambdas.
Flûte De Merde, Java. C'est juste encore un autre des nombreux obstacles que vous jetez dans notre chemin tout en essayant de faire le code de la moindre nettoyer à l'aide de Java 8 lambdas.
OriginalL'auteur Alex Baranosky | 2010-06-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer à la Classe de l'objet, puis vérifiez que par programmation.
Je ne suis pas sûr si vous voulez le renvoyer ou pas; renvoi serait du même ordre que l'échec ou l'erreur du test, mais sémantiquement je ne le ferais pas, car il signifie "nous n'avons pas l'exception, nous nous attendions", et donc qui représente une erreur de programmation, à la place d'un environnement de test d'erreur.
Kirkham:
isAssignableFrom
prend une Classe en tant que paramètre, et fait essentiellement la même chose queisInstance
n'sur un objet.isInstance
renvoie vrai si l'argument est compatible avec l'assignation de la classe, de sorte qu'il fonctionne sur les sous-classes de la même manière.Bourillion: je suis plus intéressé par les possibilités techniques de préconiser une manière ou d'une autre. Je pense que ton post correctement les adresses les dangers d'une telle approche, et déjà upvoted vous en conséquence.
Alors que je suis d'accord avec @KevinBourrillion s 'sentiment, je n'aime vraiment pas les couper et coller l'exacte même try catch gestionnaire de code à chaque fois je m'attends à une exception. Je suis venu avec une solution beaucoup comme celui-ci, sauf que je vérifie également sur le message d'erreur donc je sais exactement qui d'erreur spécifique a été levée. Je peux accepter la légère perte de clarté pour une séquence normalisée, ce qui est facile à identifier et beaucoup plus agréable de code.
peut-être throw new RuntimeException(ex) au lieu de cela, pour ceux d'entre nous qui ne peuvent pas lancer d'Exception...
OriginalL'auteur Mark Peters
Je comprends l'impulsion pour essayer de simplifier vos exception-test de l'idiome, mais sérieusement: ne pas. Chaque choix possible, vous allez venir avec un remède qui est pire que la maladie. Surtout JUnit 4 @ExpectedException non-sens! C'est un trop-intelligent frameworky solution, obligeant tout le monde à apprendre comment il fonctionne, par opposition à une plaine de soi peu de l'ordinaire de code Java. Pire, il ne vous donne aucun moyen pour envelopper une partie seulement de votre test que vous pouvez vous attendre à jeter l'exception, donc, si une étape de configuration jette la même exception, votre test passe même si votre code est cassé.
Je pourrais écrire une longue diatribe à ce sujet ici (je suis désolé de ne pas avoir assez de temps pour), comme nous avons eu une longue discussion à ce sujet entre Java des ingénieurs de chez Google, et le consensus est que aucun de ces fous des solutions sont à la peine. S'habituer à try/catch, c'est vraiment pas mal.
OriginalL'auteur Kevin Bourrillion
Les génériques ne sont pas les types. Ils ne sont pas des modèles. Ils sont de la compilation type de contrôles, en Java. Exception blocs catch sur type. Vous pouvez catch(Exception e) ou même de catch(Throwable e) et ensuite coulé en tant que de besoin.
OriginalL'auteur UB Mobile Banking
Eh bien, vous pourriez juste l'Exception de catch et de la renvoyer si elle n'est pas prévu d'Exception. Bien que les bonnes pratiques de codage indique généralement que le succès de chemin de code ne doit pas être défini par une Exception, de sorte que vous voudrez peut-être repenser votre conception.
MarkPeters réponse est à peu près ce que j'allais pour. Si elle a encore tout le "on attend la réussite de l'exécution requiert la voie des exceptions, tandis que l'erreur de cas ne fonctionne pas." Il modifie également l'exécution légèrement, de manière inattendue, les exceptions ne sont pas relancés, mais au lieu de déclencher un appel à l'échec. Dans votre code, vous avez eu trois chemins, devrait exception, exception inattendue qui va jusqu'à la pile, et pas d'exception à tous, l'appel échoue. La Marque du code simplifie attendus de l'exception et de l'appel de l'échec pour les exceptions inattendues et non l'exception des cas.
Désolé, commencé mon commentaire avant de vous ajouter le vôtre. Il y a un potentiel d'utilisation dans les tests, mais je voulais attention juste au cas où c'était pour le code de production. Moderne gestion des exceptions optimise pour le no cas d'exception, donc en vertu de succès circonstances, vous serez encourir de frais généraux que votre cas d'échec évite. Pervers, pour dire le moins.
OriginalL'auteur ShadowRanger
Vous pouvez également utiliser un IDE qui prend en charge live template ( comme IntellJ IDÉE par exemple ) et affecter un raccourci comme
ee -> [tab]
qui insère le try/catch/ignorer et vous permettre de taper la bonne.comme ceci http://img80.imageshack.us/img80/433/capturadepantalla201006j.png
comme ceci http://img641.imageshack.us/img641/6733/capturadepantalla201006w.png
OriginalL'auteur OscarRyz
Clause Catch avec le type de paramètre n'est pas possible:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCatch
OriginalL'auteur odoepner