Le suffixe Exception sur les exceptions en Java


19

La spécification d'un suffixe d'Exception sur les classes d'exceptions me semble être une odeur de code (informations redondantes - le reste du nom implique un état d'erreur et hérite d'Exception). Cependant, il semble également que tout le monde le fasse et cela semble être une bonne pratique.

Je cherche à comprendre pourquoi c'est une bonne pratique.

J'ai déjà vu et lu la question de savoir pourquoi les exceptions ont généralement l'exception de suffixe dans le nom de la classe

La question est pour PHP et bien que les réponses soient probablement valables pour Java. Y a-t-il d'autres arguments ou est-ce vraiment aussi simple que de les différencier explicitement?

Si nous prenons les exemples de la question précédente - pourrait-il vraiment y avoir des classes en java avec le nom FileNoFoundqui ne fait pas exception? S'il peut y en avoir, cela justifie-t-il son suffixe Exception?

En regardant une hiérarchie rapide dans l'éclipse de Exception, bien sûr, la grande majorité d'entre eux ont le suffixe d'exception, mais il y a quelques exceptions. javassistest un exemple de bibliothèque qui semble avoir quelques exceptions sans le suffixe - par exemple BadByteCode, BadHttpRequestetc.

BouncyCastle est une autre bibliothèque avec des exceptions comme CompileError

J'ai aussi cherché un peu sur Google avec peu d'informations sur le sujet.


2
"Toutes les exceptions devraient-elles porter un Exceptionsuffixe, ou devrions-nous faire des exceptions pour les exceptions exceptionnelles?" ;)
tdammers

2
en fait, l'erreur est comme une exception (voir OutOfMemoryError) mais elles sont destinées à des choses difficiles à récupérer (donc vous ne les traitez presque jamais)
ratchet freak

1
De plus, j'ai entendu qu'en règle générale «les classes devraient être des noms et les méthodes devraient être des verbes (actions)». FileNotFound ArrayIndexOutOfBoundset OutOfMemorysont plus d'observations / descriptions, mais sont ensuite appliquées au nom Exception.
MikeTheLiar

Réponses:


27

La réponse de Landei est bonne, mais il y a aussi la réponse grammaticale. Les noms de classe doivent être des noms . Qu'est-ce qu'un "OutOfMemory"? Qu'est-ce qu'un "FileNotFound"? Si vous pensez à "Exception" comme le nom, alors le descripteur est l'adjectif qui le spécifie. Ce n'est pas n'importe lequel Exception, c'est un FileNotFoundException. Vous ne devriez pas avoir besoin d'attraper unOutOfMemory plus que vous n'iriez au magasin pour acheter un "bleu".

Cela apparaît également si vous lisez votre code sous la forme d'une phrase: " Tryfaire ..., et catch OutOfMemory Exceptions"


1
Pour citer l'article "Essayez d'utiliser des noms car une classe représente normalement quelque chose dans le monde réel". Mais les exceptions tombent-elles dans ce cas? Pour moi, ils ressemblent plus à un artefact de programmation, représentant un message d'erreur. "Vous obtiendrez une OutOfMemoryexception" se lit mieux que "Vous obtiendrez une OutOfMemoryExceptionexception", n'est-ce pas?
greg0ire

1
@ greg0ire - Vous devriez l'essayer comme "Vous obtiendrez un OutOfMemoryException." Cela dit, nous avons également des codes PIN et des distributeurs automatiques de billets, donc une exception OOME ne serait pas si inhabituelle.
Bobson

Je pense que le point que vous faites ici est vraiment le meilleur (celui sur les conflits de noms ne tient plus grâce aux espaces de noms, au moins en php). J'ai plus de choses à dire sur tout cela, et je posterai bientôt une réponse.
greg0ire

Terminé! Qu'est-ce que tu penses?
greg0ire

@Bobson, je recommande la lecture du royaume des noms . Nous n'avons pas besoin de tout pour être un nom. Pourquoi « vous obtiendrez un OutOfMemoryException» quand il peut simplement être « vous êtes hors de la mémoire »? Nous n'utilisons pas Classsuffixes ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli

6

Je pense que les exceptions (et les erreurs, et théoriquement d'autres Throwable) sont différentes de choses comme les interfaces ou les énumérations (qui ne sont généralement pas utilisées comme suffixe): elles ont généralement un objectif très clair et limité, elles sont utilisées avec des constructions de langage spécialisées ( try, catch, throw,throws ) et suivre des règles spéciales (par exemple vérifié vs exceptions non vérifiées, pas de génériques). D'une certaine manière, ce ne sont pas seulement des classes qui sont utilisées comme exceptions, mais un mécanisme d'exception qui est implémenté au moyen de classes.

Donc, si vous traitez une exception et que vous ne la reconnaissez pas en tant que telle, généralement quelque chose ne va pas (ce qui n'est pas le cas pour des choses comme les énumérations ou les interfaces). Je pense donc que ces différences par rapport aux classes "normales" sont suffisamment importantes pour exiger un indice visuel.


1
Cela me semble contradictoire. Si les exceptions sont si spéciales et utilisées de manière spéciale et si clairement reconnaissables, pourquoi avez-vous besoin d'un indice visuel?
Michael Borgwardt

@MichaelBorgwardt - Je pense qu'il dit que parce qu'ils sont spéciaux et utilisés de manière spéciale, ils devraient avoir un indice visuel pour être évidemment reconnaissables. Cela étant dit, je ne sais pas si vous pouvez même lancer quelque chose qui n'est pas hérité de ExceptionJava - vous ne pouvez pas en C #. Si vous ne le pouvez pas, alors je ne peux pas penser à un scénario où vous seriez "face à une exception et [ne] la reconnaissez pas comme telle".
Bobson

Vous ne pouvez pas non plus lancer de non- Throwables en Java. Cependant, vous pouvez traiter l'exception non seulement dans les paramètres try- catch, par exemple, vous pouvez collecter des exceptions lorsque vous effectuez une sorte de validation pour des objets complexes (lorsque vous voulez connaître tous les problèmes associés, pas seulement le premier). Dans de tels cas, vous devez savoir que vous pouvez par exemple relancer les choses que vous avez dans votre liste, il serait donc mauvais de les appeler, c'est-à-dire ValidationIssueau lieu de ValidationException.
Landei

0

Cependant, il semble également que tout le monde le fasse et cela semble être une bonne pratique.

Oui, tout le monde le fait en effet, c'est donc une pratique, mais est-ce toujours bon? Plusieurs personnes s'interrogent sur:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Le suffixe d'exception § contexte: php)
  • la vidéo liée, https://vimeo.com/album/2661665/video/74316116 (passer à 53:00, contexte: php), inspire l'article et fait remarquer que chaque fois que vous utilisez une exception, vous avez un mot-clé qui montre déjà qu'il s'agit d'une exception à proximité
  • http://verraes.net/2013/10/verbs-in-class-names/ montre comment la déclaration dans la réponse de @Bobson peut ne pas être un absolu, et fait remarquer que parfois le suffixe est bon, pour une application ou les exceptions au niveau de l'infrastructure, et parfois vous devriez essayer de sauvegarder les caractères pris par ce long suffixe pour exprimer quelque chose de plus précis et significatif. Ce point n'a de sens que si vous utilisez une langue où la culture consiste à utiliser des exceptions pour les violations des règles métier.
  • le lien SO que vous fournissez indique les conflits de noms, mais maintenant, nous avons des espaces de noms, n'est-ce pas?

C'est une question java , pas une question php . Les idiomes sont différents entre les langues. Cela dit, je suis fortement en désaccord avec cette citation de votre troisième lien: "Les exceptions peuvent être similaires aux événements, ... avec la nuance qu'il s'agit d'un événement indésirable, un avertissement qu'une opération était incompatible avec, par exemple, les règles commerciales qui sont en vigueur. " Peut-être que PHP est différent à ce sujet, mais à mon avis, les exceptions sont censées être exceptionnelles. Si une règle métier est violée de quelque manière que ce soit, votre logique normale doit la gérer - ce n'est pas une exception au comportement normal.
Bobson

Vous avez peut-être raison en ce qu'il varie d'une langue à l'autre: consultez ce fil sur python: gossamer-threads.com/lists/python/python/796627 . php et python ne sont clairement pas axés sur les performances, c'est peut-être pourquoi il y a cette différence avec java (qui est axé sur les performances, non?). Si vous avez plusieurs couches à traverser dans votre pile d'appels avant d'être au bon niveau pour gérer correctement la violation des règles métier, les exceptions sont les meilleures IMO. Cela rend également les types de retour plus cohérents (vous retournez toujours le même type, pas faux ou vrai). Je vais modifier ma réponse ceci en compte
greg0ire
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.