Quelle est la meilleure pratique à suivre lorsque vous devez lever une exception qui n'a pas été définie dans une interface que vous implémentez?Lance une exception non définie dans l'interface
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 qui se produit lors de la lecture des petits gâteaux, de sorte que vous voulez lancer une exception liée à cela. Cependant, Reader ne définit pas ce type d'exception dans son interface, alors que faites-vous? En outre, il n'a pas de sens pour ajouter CupcakeException à l'lancers francs l'interface clause du lecteur, parce que ce type d'exception est spécifique à CupcakeReader. Une façon de contourner cela est d'avoir Reader définir lire de sorte qu'il lève un certain type parent, comme Exception, mais vous perdez le contexte de l'exception. Que devriez-vous faire dans cette situation? Merci!
Une autre situation intéressante qui a été soulevée concerne une interface sur laquelle vous n'avez aucun contrôle. Dans ce cas, quelle est la meilleure façon d'indiquer qu'un problème est survenu?
À titre 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 changer lecteur, mais vous voulez indiquer qu'un problème est survenu dans de CupcakeReader lire méthode.
C'est encore pire que ce que je pensais. De cette façon, vous ne pouvez même pas utiliser le chaînage pour contourner le système. Je pense que vous devez recourir à (ouch!) 'RuntimeExceptions'. –
J'ai eu recours à System.err.println et à exception.printStackTrace() ;. Est-ce approprié, ou devrais-je propager l'erreur avec un RuntimeExecption comme vous l'avez dit? – Scott
Je pense que log + swallow n'est pas approprié 99,99% du temps. C'est un modèle commun (anti -?) Parmi les développeurs Java à cause du problème présenté ici. Dans mon «école de pensée», il n'y a que trois façons valides de traiter les exceptions: la réitération, la manipulation (c'est-à-dire réparer le problème), ou laisser le soin à quelqu'un de s'en occuper. N'avale jamais. Si quelque chose ne va pas, il y aura des conséquences. –