2017-10-19 23 views
1

J'ai un cas d'utilisation où je veux retourner des données (un objet) que je lance une exception. J'envisage de stocker les données dans ma classe d'exception vérifiée personnalisée et d'y accéder via un getter lorsque l'exception est interceptée plus haut dans la pile. Est-ce considéré comme une mauvaise idée? Si oui, quelles sont les meilleures alternatives? J'ai vu l'envoi de messages pertinents à l'exception personnalisée, mais je ne l'ai pas vraiment vu utilisé comme magasin de données.Est-ce une mauvaise idée de stocker des données dans une exception vérifiée personnalisée?

J'ai trébuché sur Return a value AND throw an exception? et l'une des réponses est de faire quelque chose de similaire. Je pensais plutôt à surcharger le constructeur et à fournir l'objet au lieu de le passer comme un autre argument. Est-ce considéré comme une mauvaise pratique de codage?

public class NameException extends Exception 
{ 

    private static final long serialVersionUID = -4983060448714460116L; 
    private Service externalService; 


    public NameException(final String message) 
    { 
     super(message); 
    } 

    public NameException() 
    { 
    } 

    public NameException(Service externalService) 
    { 
     this.externalService =externalService; 
    } 

    public Service getExternalService() 
    { 
     return externalService; 
    } 
} 
+1

Je pense que ce n'est pas une mauvaise idée, c'est en fonction de vos besoins. – assembler

Répondre

2

Ceci est un modèle établi.

Par exemple, les méthodes de requête HTTP de Spring RestTemplate peut jeter un RestClientResponseException qui a des méthodes telles que byte[] getResponseBodyAsByteArray(), String getResponseBodyAsString(), HttpHeaders getResponseHeaders(), String getStatusText() et ainsi de suite.

+0

En guise de suivi, est-il sensé d'ajouter des vérifications nuls sur les paramètres passés dans l'exception personnalisée? L'API à laquelle vous avez fait référence ne semble pas faire autre chose que de simplement indiquer quels champs sont nullables. – linuxNoob

+0

Ajouter des vérifications nuls où? C'est la responsabilité du code de lancement de remplir tous les champs qui peuvent ne pas être nuls. Si vous faites confiance à ce code, vous n'avez pas besoin d'ajouter de code pour vérifier. Cela dépend de la défensive que vous voulez être. – slim

+0

Null vérifie les arguments formels passés au constructeur de façon 'externalService' dans l'exemple de mon article. – linuxNoob