Quand devrions-nous créer nos propres classes d'exception java?

D'un bon point de vue de la conception/ pratique, quand devrions-nous créer et utiliser des classes d'exception java personnalisées au lieu de celles déjà prédéfinies en java?

Dans certaines applications, Je ne vois presque pas, ou même aucune classe d'exception personnalisée créée, ils font un effort pour toujours utiliser des exceptions java natives. D'autre part, certaines applications définissent des exceptions personnalisées pour tout.

Quelle est la meilleure pratique?

Merci!

32
demandé sur Jigar Joshi 2014-03-28 00:32:10

5 réponses

De meilleures pratiques pour la gestion des exceptions :

Essayez de ne pas créer de nouvelles exceptions personnalisées si elles ne contiennent pas d'informations utiles pour le code client.

Quel est le problème avec le code suivant?

public class DuplicateUsernameException extends Exception {}

Il ne donne aucune information utile au code client, autre qu'un nom d'exception indicatif. N'oubliez pas que les classes D'Exception Java sont comme les autres classes, dans lesquelles vous pouvez ajouter des méthodes que vous pensez que le code client appellera pour en obtenir plus information.

Nous pourrions ajouter des méthodes utiles à DuplicateUsernameException, telles que:

public class DuplicateUsernameException
    extends Exception {
    public DuplicateUsernameException 
        (String username){....}
    public String requestedUsername(){...}
    public String[] availableNames(){...}
}

La nouvelle version fournit deux méthodes utiles: requestedUsername(), qui renvoie le nom demandé, et availableNames(), qui renvoie un tableau de noms d'utilisateur disponibles similaires à celui demandé. Le client peut utiliser ces méthodes pour informer que le nom d'utilisateur demandé n'est pas disponible et que d'autres noms d'utilisateur sont disponibles. Mais si vous n'ajoutez pas d'informations supplémentaires, lancez simplement une norme exception:

throw new IllegalArgumentException("Username already taken");
31
répondu mabbas 2017-11-22 09:24:22

D'un bon point de vue de la conception/ pratique, quand devrions-nous créer et utiliser des classes d'exception java personnalisées au lieu de celles déjà prédéfinies en java?

Lorsque les noms d'exception existants ne couvrent pas vos besoins.

Une autre préoccupation de conception est d'étendre la" bonne " classe d'exception; par exemple, si vous déclenchez une exception liée aux E / S, vous devriez idéalement hériter IOException; si l'exception indique une erreur de programmeur, vous devriez hériter RuntimeException (c'est-à-dire, faire votre exception décochée).

Lever des exceptions personnalisées vous permet également de traiter les exceptions d'une manière plus précise; par exemple, si vous avez défini FooException héritant IOException, vous pouvez avoir un traitement spécial pour cela:

try { ... }
catch (FooException e) { ... } // Catch it _before_ IOException!
catch (IOException e) { ... }

En outre, les exceptions sont des classes comme les autres, vous pouvez donc ajouter des méthodes personnalisées, etc.; par exemple, Jackson définit JsonProcessingException qui hérite de IOException. Si vous l'attrapez, vous pouvez obtenir des informations de localisation de l'erreur d'analyse en utilisant .getLocation().

9
répondu fge 2014-03-27 20:45:32

Certainement quand vous vous attendez à pouvoir gérer par programmation une exception-c'est-à-dire qu'il est facile de créer des instructions de capture séparées pour différents types d'exception, c'est-à-dire:

try{    
  buyWidgets();
}
catch(AuthenticationException ex)
{
  promptForLogin();
}
catch(InsufficientFundsException ex)
{
  promptToRefillAccount();
}
//let other types of exceptions to propagate up the call stack

Sur la question de savoir si ce qui précède constitue une utilisation inappropriée de l'exception pour le contrôle de flux

Bien que les exceptions soient plus coûteuses en CPU que les instructions if-else (principalement en raison du coût de construction d'une trace de pile), le coût est relatif et doit être évalué dans le contexte d'un cas d'utilisation particulier. Pas tous les morceau de code doit être rapide à l'échelle du web et certaines personnes trouvent la lecture et les tests conditionnels plus encombrants. Par exemple, à peu près tous les gestionnaires de transactions implémentent des idiomes commit-rollback-retry en utilisant des exceptions. (Essayez d'écrire un aspect de nouvelle tentative de transaction sans attraper une exception)

Séparément, il faut adhérer au principe de séparation des préoccupations: chaque morceau de code n'a pas besoin de traiter toutes les conditions possibles. Si ne pas être connecté lors de l'achat de widgets est un cas exceptionnel dépend vraiment de l'application et de la place particulière à l'application de la base de code. Par exemple, vous pouvez avoir un Service avec des opérations pour les utilisateurs connectés. Cela n'a aucun sens pour les méthodes de ce service de traiter l'authentification - à la place, ces méthodes s'attendraient à ce que le code plus tôt dans la chaîne d'appels s'assure que l'utilisateur est authentifié, et donc simplement lancer des exceptions si ce n'est pas le cas. Ainsi, pour ces méthodes n'étant pas connecté EST un cas exceptionnel.

5
répondu Nikita 2014-03-28 15:07:33

Je crée souvent des Exceptions personnalisées s'il y a plus d'informations que je dois transmettre au lieu d'un simple message d'erreur.

Par exemple, des codes d'erreur particuliers ou des valeurs réelles vs attendues. ceux-ci peuvent également avoir leurs propres getters afin que vous puissiez récupérer ces champs sans avoir à analyser le message de chaîne qui pourrait se casser si vous modifiez le texte du message. (Ou traduisez-le dans une autre langue)

Si vous faites vos propres Exceptions, je le ferais recommandez d'étendre les exceptions JDK communes intégrées afin que votre API puisse dire throws IOException mais elle lance vraiment MycustomIOException. de cette façon, les utilisateurs de votre API n'ont pas besoin de connaître vos propres versions personnalisées, sauf s'ils le souhaitent.

0
répondu dkatzel 2014-03-27 20:41:08

Il est bon d'avoir des exceptions personnalisées dans votre application, l'une peut être une exception personnalisée de niveau supérieur pour les applications, d'autres au niveau du module/paquet. Si vous avez une fonction/opération spécifique dans l'application et que vous devez informer l'utilisateur si une exception s'est produite pendant l'opération, il est préférable d'ajouter une exception personnalisée pour cette opération. Il sera facile de déboguer/enquêter sur les problèmes.

0
répondu Shailendra Singh 2015-06-09 05:54:51