web-dev-qa-db-fra.com

Renvoyer une valeur ET lancer une exception?

Je travaille avec une API qui prétend retourner true si elle réussit et false si elle échoue. Mais, il prétend également lever différentes exceptions en cas d'échec. Comment peut-il retourner false et lever une exception?

22
mark

Il n'est pas possible à la fois de lever une exception et de renvoyer une valeur à partir d'un seul appel de fonction.

Peut-être que cela fait quelque chose comme renvoyer false s'il y a une erreur, mais lancer une exception si l'entrée n'est pas valide.

edit: PaulPRO a posté une réponse (maintenant supprimée) soulignant qu'il est techniquement possible de provoquer la levée d'une exception dans un thread différent, tout en renvoyant une valeur dans le thread actuel. Je pensais que cela valait la peine d'être noté, même si ce n'est pas quelque chose que vous devriez jamais voir.

28
Jeremy Banks

Vous pouvez lancer une exception qui a une valeur (dans ce cas booléenne):

public class ValueException extends Exception {
    final boolean value;

    public ValueException(boolean value, String message) {
        super(message);
        this.value = value;
    }

    public boolean getValue() {
        return value;   
    }
}
22
Bohemian

Bien qu'il soit possible d'écrire votre code de telle manière qu'une exception ET une valeur puisse être dérivée d'un appel de fonction (voir les articles ci-dessus), cela ne devrait JAMAIS être fait avec un codage approprié.

J'aimerais voir un lien vers la documentation sur cette API. Les API doivent donner la priorité à la clarté. Lancer une exception et renvoyer une valeur laisse la question de savoir si la valeur qui a été renvoyée est sûre à utiliser ou si elle n'est pas valide.

N'oubliez pas que les blocs try/catch sont l'AUTRE méthode de gestion des exceptions. Ils ne transmettent pas l'exception à la méthode appelante, mais la gèrent en interne d'une manière que le développeur juge appropriée.

Si, à des fins de débogage, vous avez besoin de voir la valeur résultante dans le cas d'une exception, alors l'idée de Bohemian fonctionne bien.

0
HesNotTheStig