Lancer une exception non définie dans l'interface
Quelles sont les bonnes pratiques à suivre lorsque vous avez besoin de lancer une exception qui n'est pas définie à une interface qui vous mettent en œuvre?
Voici un exemple:
public interface Reader
{
public abstract void read() throws IOException;
}
public class CarrotReader implements Reader
{
public void read() throws IOException {}
}
public class CupcakeReader implements Reader
{
public void read() throws IOException, CupcakeException {}
}
Dans ce cas, vous avez une exception se produit lors de la lecture de petits gâteaux, si vous souhaitez lancer une exception en la matière. Cependant, Lecteur ne définit pas ce type d'exception dans son interface, alors que faites-vous? En outre, il n'est pas judicieux d'ajouter CupcakeException à la jette clause dans le Lecteur interface, car ce type d'exception est spécifique à CupcakeReader. Une façon de contourner cela est d'avoir Lecteur définir lire tel qu'il jette un peu de type parent, comme Exceptionmais alors vous perdez le contexte de l'exception. Que devez-vous faire dans cette situation? Merci!
Une autre situation intéressante qui a été mis en place consiste en une interface sur laquelle vous n'avez aucun contrôle. Dans ce cas, quel est le meilleur moyen d'indiquer qu'un problème est survenu?
À des fins d'illustration, voici un autre exemple:
public interface Reader
{
public abstract void read();
}
public class CupcakeReader implements Reader
{
public void read() throws CupcakeException {}
}
Dans ce cas, vous ne pouvez pas modifier Lecteurmais vous voulez indiquer qu'un problème a eu lieu en CupcakeReader's lire méthode.
source d'informationauteur Scott
Vous devez vous connecter pour publier un commentaire.
Vous pourriez avoir à créer une exception de type attendu à la place.
Utiliser ce qu'on appelle ReaderException qui servira à la racine de l'interface de votre exception de la hiérarchie. ReaderException sera également fournit un lien vers d'autres exceptions que faire jeter en raison de la baisse du niveau des exceptions.
Exception est la partie de l'interface. Définir un parent générique pour tous vos exceptions dans l'interface, vous pouvez redéfinir l'interface.
Vous pouvez également faire CupcakeException un enfant de IOException.
Il suffit de ne pas utiliser checked exceptions.
L'exemple que vous nous avez montré est l'une des raisons checked exceptions sont mauvais.
La raison principale est que l'utilisateur de votre cupcake lecteur aura à gérer votre exception, indépendamment de savoir si il est intéressé ou pas.
Ainsi, au lieu de:
Vous forçant à faire:
Pense que ce qui est mieux, plus lisible et moins sujette aux erreurs et cesser d'utiliser checked exceptions.
EDIT:
Je suis surpris par la note négative. Il y a des gens qui pensent encore que les exceptions sont grands? Si oui, voici quelques références pourquoi vous ne devriez pas utiliser checked exceptions:
Vous pourriez peut-être faire un résumé ReaderSpecificException classe, mettez-la dans l'Interface, et
sous-classe CupcakeException de cette classe abstraite.
Si vous créez un plus abstrait exception qui fonctionne comme une classe de base pour CupCakeException vous n'avez pas lier l'Interface du Lecteur à une mise en œuvre spécifique comme vous seriez si vous avez ajouté le CupCakeException à l'interface du Lecteur.
Si vous ne laissez pas une Exception hériter d'une autre il y a un constructeur dans la classe d'exception qui prend un throwable comme deuxième argument comme Thorbjørn Ravn Andersen déjà montré dans son court exemple de code. Le vous permet de générer un plus abstrait exception et chaque partie de votre code qui a besoin de savoir plus que juste de "il y a une erreur" chercher la cause de la hausse exception.