Est-il sage d'utiliser des génériques pour les exceptions?
Mon équipe est dans le milieu de nettoyage de notre utilisation de throws Exception
et de supprimer ou de les remplacer avec des exceptions spécifiques.
Une commune de jette est parce qu'une entité n'a pas été trouvé. Devrions-nous être jeter un générique NotFoundException
ou un SomeClassNotFoundException
pour chaque classe d'entité?
Si nous devrions lancer une exception spécifique, devrions-nous être la création d'une Exception de la classe pour chaque type d'entité? Peut-on utiliser en toute sécurité des médicaments génériques? Comme ce class NotFoundException<T extends EntityBaseClass> extends Exception
et puis le constructeur prend soin de déclarer ce type d'Entité que nous avons affaire?
Si nous devrions lancer une exception spécifique et de ne pas utiliser les génériques, ces dérogations devraient prolonger ou de mettre en œuvre un NotFoundException
classe abstraite ou une interface?
Vous devez vous connecter pour publier un commentaire.
Un simple test décisif pour la question
est
Si la réponse est "oui", des
ClassXNotFoundException
est nécessaire; autrement, il n'est probablement pas.Quant à la deuxième partie de votre question, la langue n'a pas permis l'utilisation de médicaments génériques pour les types d'exception.
Il n'est pas permis de faire des exceptions génériques - il ne compile pas (JLS §8.1.2):
Depuis les paramètres de type de médicaments génériques sont effacés au moment de l'exécution, il n'y a aucun moyen de distinguer entre les génériques des exceptions avec les différents paramètres de type dans la
catch
clause, ainsi exceptions génériques ne sont pas pris en charge. Donc, vous avez réellement n'avez pas le choix quant à l'utilisation de générique exceptions.Au lieu d'utiliser:
Vous devez utiliser:
De cette façon, vous pouvez conserver une référence pour le type d'Entité qui génère l'exception. Pour lancer un de ces exceptions, vous pouvez utiliser:
Le compilateur sera valider que le Client ne s'étendent EntityBaseClass.
Si les appelants de votre code peut raisonnablement récupérer une panne de localiser une définition de l'entité et aurait avantage à être en mesure de prendre une autre stratégie de récupération par type d'entité, alors oui. Sinon, non.
Il ne va pas aider les appelants de votre commutateur de code sur le type d'entité liée à l'échec.
Même si vous définissez un type d'exception
MyParameterizedException<T>
de type-erasure, l'appelant ne peut pas faireparce qu'avec le type d'effacement, il ressemble à
et la deuxième
catch
bloc serait inaccessible code et pourra être rejetée au moment de la compilation parjavac
. Le premier bloc catch serait entré pour le type b et de type d'une des entités (et tous les autres types).Si les appelants de votre code devrait être surpris si ils n'ont pas, alors oui.
Si les appelants de votre code de bénéficier d'entité échecs traitées par le code qui gère les autres
NotFoundException
s, alors oui.Si les appelants de votre code, ne serait vraisemblablement pas envie d'avoir des échecs de localiser un type d'entité définition traités de la même manière que les autres
NotFound
conditions alors non.Je pense que tout le monde la réponse est de dire que vous n'avez pas besoin d'une exception spécifique. J'étais en train de regarder comment Hibernate définit pas trouvé exception. J'ai trouvé EntityNotFoundException je voudrais ajouter que vous ne devriez PAS même créer votre propre exception, simplement utiliser ce un. Il s'étend RuntimeException ce qui signifie que vous ne sont pas de forcer les gens à l'attraper. Mais si vous voulez, alors vous pouvez réutiliser une classe existante dans J2EE. Ce qui est toujours mieux que d'écrire du nouveau code.