web-dev-qa-db-fra.com

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

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

Dans certaines applications, je ne vois presque aucune, ou même aucune classe d'exception personnalisée créée, elles s'efforcent de toujours utiliser les exceptions natives Java. En revanche, certaines applications définissent des exceptions personnalisées pour tout.

Quelle est la meilleure pratique?

Merci!

36
PedroD

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 Java Les classes d'exception sont comme les autres classes, dans lesquelles vous pouvez ajouter des méthodes que vous pensez que le code client invoquera pour obtenir plus d'informations.

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 propose deux méthodes utiles: requestedUsername(), qui renvoie le nom demandé, et availableNames(), qui retourne un tableau de noms d'utilisateurs disponibles similaires à celui demandé. Le client pourrait 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'allez pas ajouter d'informations supplémentaires, , alors lancez simplement une exception standard:

throw new IllegalArgumentException("Username already taken");
42
M. Abbas

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

Lorsque les noms d'exceptions existants ne répondent 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 programmation, vous devez hériter RuntimeException (c.-à-d., faire votre exception non vérifiée).

L'augmentation des exceptions personnalisées vous permet également de traiter les exceptions de manière plus précise; par exemple, si vous avez défini FooException héritant IOException, alors 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 sur l'emplacement de l'erreur d'analyse à l'aide de .getLocation() .

10
fge

certainement lorsque vous vous attendez à être en mesure de gérer une exception par programme - c'est-à-dire qu'il est facile de créer des instructions catch distinctes pour différents types d'exceptions, 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 coûtent plus cher au processeur 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. Tous les morceaux de code n'ont pas besoin d'être rapides à l'échelle du Web et certaines personnes trouvent les conditions de lecture et de test plus lourdes. Par exemple, presque tous les gestionnaires de transactions implémentent des idiomes commit-rollback-retry à l'aide d'exceptions. (Essayez d'écrire un aspect de nouvelle tentative de transaction sans intercepter une exception)

Séparément, il faut respecter le principe de la séparation des préoccupations: chaque élément de code n'a pas besoin de traiter toutes les conditions possibles. Le fait de 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 dans la base de code de l'application. Par exemple, vous pourriez 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 gérer l'authentification - au lieu de cela, ces méthodes s'attendraient à ce que le code soit plus tôt dans la chaîne d'appels pour garantir que l'utilisateur est authentifié, et donc simplement lever des exceptions si ce n'est pas le cas. Ainsi, pour ces méthodes non connectées [~ # ~] est [~ # ~] un cas exceptionnel.

6
Nikita

Vous le faites lorsque vous utilisez votre propre exception ajoute valeur à votre base de code.

C'est aussi simple que cela. La valeur pourrait être:

  • la capture à un niveau supérieur peut être plus facile, par exemple lorsque toutes vos exceptions ont un type de base commun
  • votre exception porte des données d'addition (nous incluons des clés NLS dans nos propres exceptions, de sorte qu'une couche supérieure sache comment transmettre des messages aux utilisateurs humains en tenant compte de I18N)
2
GhostCat

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/package. 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.

1
Shailendra Singh

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 par rapport aux valeurs attendues. ceux-ci peuvent également avoir leurs propres getters afin que vous puissiez récupérer par programmation ces champs sans avoir à analyser le message String qui pourrait se casser si vous modifiez jamais le texte du message. (Ou traduisez-le dans une autre langue)

Si vous créez vos propres exceptions, je recommanderais d'étendre le JDK commun intégré dans les exceptions afin que votre API puisse dire throws IOException mais ça jette 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.

1
dkatzel