Envelopper une exception cochée dans une exception non cochée en Java?
J'ai cette méthode d'usine en java:
public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
if (config == null) {
InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
config = new Properties();
config.load(in);
}
return config;
}
Et je veux transformer les deux exceptions vérifiées en exceptions non cochées. Quelle est la meilleure façon d'aller à ce sujet?
Devrais-je simplement attraper l'exception et lancer une nouvelle exception RuntimeException en utilisant l'exception interceptée comme exception interne?
Est-il une meilleure manière de faire ceci ou devrais-je même essayer de le faire en premier lieu?
Modifier:
Juste pour clarifier. Ces exceptions seront fatales, comme le fichier de configuration est essentiellement au fonctionnement du programme et toutes les exceptions seront interceptées et enregistrées au niveau supérieur de mon programme.
Mon but est d'éviter une exception de throws inutile, exception ajoutée à la signature de chaque méthode qui appelle mon usine.
4 réponses
A RuntimeException
ne doit être utilisé que lorsque le client ne peut pas récupérer quel que soit le problème. Il est parfois approprié de faire ce dont vous parlez, mais le plus souvent ce n'est pas approprié.
Si vous utilisez un JDK >= 1.4, alors vous pouvez faire quelque chose comme:
try { // Code that might throw an exception } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); }
Et le rethrown RuntimeException
aura la cause originale incluse à l'intérieur. De cette façon, quelqu'un en haut du fil attrape le RuntimeException
- Vos fils attrapent RuntimeException
afin qu'ils ne meurent pas silencieusement, droit? -- peut au moins Imprimer la trace complète de la pile de la cause.
, Mais comme d'autres l'ont dit et diront, les exceptions sont vérifiées pour une raison. Ne le faites que lorsque vous êtes sûr que vos clients ne peuvent pas récupérer du problème que vous repensez comme une exception non cochée.
NOTE: mieux que {[1] } serait d'utiliser une exception non cochée plus spécifique si elle est disponible. Par exemple, si la seule raison pour laquelle votre méthode pourrait lancer un ClassNotFoundException
est le fichier de configuration est manquant, vous pouvez relancer un MissingResourceException
, qui est une exception non cochée mais donne plus d'informations sur la raison pour laquelle vous le lancez. D'Autres Bons RuntimeException
à utiliser s'ils décrivent le problème que vous repensez sont IllegalStateException
, TypeNotPresentException
et UnsupportedOperationException
.
Notez également que c'est toujours une bonne idée pour vos threads d'attraper RuntimeException et au minimum de le consigner. Au moins de cette façon, vous comprenez pourquoi vos fils disparaissent.
Voici une belle compilation des meilleures pratiques de gestion des exceptions.
Deux points à partir de là:
- le code de L'appelant ne peut rien faire à propos de l'exception - > en faire une exception non cochée
- le code de L'appelant prendra une action de récupération utile basée sur les informations dans exception - > en faire une exception vérifiée
Et vous pouvez lancer L'exception RuntimeException avec ou sans exception interne, en fonction de ce que l'appelant peut faire avec elle. Si vous ne repensez pas l'exception interne, vous devez la consigner dans votre méthode, si elle est importante.
Vous le faites de la bonne façon.
Afin de laisser passer les exceptions vérifiées sans être vérifiées, Vous devez les envelopper dans des exceptions non vérifiées.
Rappelez-vous simplement que les Exceptions sont vérifiées pour une raison.
Si vous voulez éviter trop de try - catch
es, attrapez les deux exceptions dans l'usine elle-même et gérez-les là.
Peut-être renvoyer une implémentation par défaut.
Vous ont pour gérer les exceptions, ici ou ailleurs.
Et comme il s'agit d'une usine, je pense qu'il est préférable que ces exceptions soient gérées dans l'usine elle-même (même méthode ou méthode différente), et renvoient une implémentation par défaut.
Quoi qu'il en soit, l'appelant (fonction métier) n'aura aucune idée sur ce qui doit être fait lorsqu'il rencontre un ClassNotFoundException
.