Je lisais certaines choses sur la manipulation des exceptions en Java, pour pouvoir écrire un meilleur code. Ok, j'admets, je suis coupable; J'ai utilisé trop de blocs Try-Catch {} Blocks, j'ai utilisé Par exemple, lorsqu'une erreur de base de données se produit, il faudra-t-il renvoyer une valeur nulle ou un code d'erreur, ou jeter l'exception? Si jeté, où cette exception devrait-elle être manipulée? Je comprends que ce n'est pas une utilisation pour vous connecter à une exception si vous ne pouvez rien faire à ce sujet. Cependant, dans les applications GUI, cela pourrait facilement tuer votre interface graphique (j'utilise SWT et j'ai vu cela trop souvent), même pour le cas de la méthode Je sais que le sujet est éternel, mais je suis impatient de passer en revue un projet de taille moyenne de 150 classes, en utilisant vos conseils. Merci beaucoup. P> ex.printstacktrace () code> dans la capture, pas même à l'aide d'un enregistreur approprié (en réalité le
system.out code> et
system.err code> a été redirigé vers un
imprimeur code>, donc un journal a été généré). Cependant, après quelques heures de lecture, je me trouve dans un endroit étrange: l'inconnu. Si les exceptions sont conçues pour passer des informations sur les états anormaux d'écoulement, comment savoir où est le niveau approprié pour faire quelque chose avec cette information? p>
Menushown () Code> (un
arrayindexoutofbounds code> Exception fermera l'application, s'il n'est pas manipulé). L'exemple pourrait continuer pour toujours, mais voici le résumé des questions: P>
Franchement, j'ai entendu parler et utiliser seulement 10%, je pense aux exceptions standard Java, en 2-3 ans. Oui, quelqu'un a dit que si l'appelant ne savait pas comment traiter les exceptions levées, il ne devrait pas avoir le droit d'appeler la méthode de lancement. Est-ce correct? Li>
9 Réponses :
Une chose que nous avons faite sur notre équipe est d'avoir des exceptions personnalisées à nos erreurs. Nous utilisons le cadre de validateur Hibernate, mais vous pouvez le faire avec n'importe quel cadre, ou des exceptions en stock. P>
Par exemple, nous avons une validationException pour gérer les erreurs de validation. Nous avons une application d'application pour gérer les erreurs système. P>
Vous voulez minimiser votre attraction. Dans notre cas, nous aurons le validateur collecter toutes les validations des objets «InvalidValue», puis lancez une seule validationException à la valeur non valide avec les informations de valeur non valides. Ensuite, vous pouvez signaler à l'utilisateur que les champs étaient en erreur, etc. p>
Dans le cas où vous avez mentionné une erreur de base de données, vous ne voudrez peut-être pas envoyer la stacktrace à l'interface utilisateur (journalisation c'est une bonne idée). C'est un cas où vous pouvez attraper l'exception de la base de données, puis organiser votre propre application à votre interface graphique. Votre interface graphique n'aura pas à savoir comment gérer un nombre infini d'erreurs de serveur, mais peut être définie pour faire face à l'application plus généraliséeException - éventuellement rapportant qu'il existe un problème avec le serveur et indiquant que l'utilisateur doit contacter votre Département du support client pour signaler le problème. P>
Enfin, parfois, vous ne pouvez pas vous empêcher d'utiliser beaucoup de blocs d'essai / attraper à cause des API externes que vous comptez sur. C'est bon. Comme mentionné précédemment, attrapez l'exception externe et le format en un qui a plus de sens pour votre application. Puis jetez l'exception personnalisée. P>
Cela ressemble à une bonne idée, merci. Cependant, je ne suis pas sûr que je devrais le faire maintenant. Ou quand l'application est plus mature. Il y a beaucoup de choses qui doivent être faites.. et le temps passe vite :-(.
Si vous attendez que l'application soit «plus mature», elle sera trop tardive, probablement pour mettre en œuvre un système de manipulation d'exception robuste. De plus, vous perdrez beaucoup de temps à gérer la couche d'interface graphique des exceptions de faible niveau qui sont peut-être levées. Ce système vous permet de gagner du temps en maintenance et en développement.
Oui, je suppose que vous avez raison et j'ai vu les effets de ne pas faire quelque chose dès le début. Il y a quelques jours, j'ai introduit log4j dans mon application et modifier la manière dont les icônes sont chargées. Homme, c'était douloureux..mais..cures quelques heures bien dépensées. Je vais essayer d'allouer du temps et des ressources pour mettre en œuvre le système de traitement.
La règle générale du pouce à une exception est, si vous pouvez faire quelque chose à ce sujet, l'attraper et le gérer, si vous ne pouvez pas le jeter à la méthode suivante. Pour entrer dans certaines de vos spécificités:
J'aime généralement enregistrer des exceptions au point où elles sont attrapées - même si je ne peux rien faire à ce sujet, cela aide à diagnostiquer le problème. Si vous ne le connaissez pas, examinez également la méthode thread.setDefaultungyrexceptionHandler. Cela vous permet de gérer des exceptions qui ne sont pas attrapées par personne et font quelque chose avec elle. Ceci est particulièrement utile avec une application d'interface graphique depuis l'exception pourraient autrement être vue. P>
d'entrer dans quelques exemples: p> Je serai heureux développer sur toutes les parties de cela si vous le souhaitez. p> p>
Oui, je suis au courant de thread.setDefaultungyrexceptionHandler. Je pense que c'est.magic! :-). Mais comment pourrait-on mettre en œuvre cette fonctionnalité pour pouvoir gérer des erreurs spécifiques et peut-être récupérer l'application GUI d'un crash méchant? J'ai déclaré l'anonyme inconventionExceptionHandler (voir ma question initiale), mais je l'utilise maintenant juste pour vous connecter, afficher un message et quitter l'application ..
Comme je suis sûr que vous savez, le gestionnaire d'exception non capturé est utilisé pour attraper des exceptions qui n'étaient pas pêchées et traitées ailleurs. À ce stade, si le gestionnaire non capateur l'obtient, cela signifie que personne d'autre ne savait à gérer l'exception et qu'il n'ya rien de quoi vous ne pouvez rien faire. Si vous avez besoin de la récupérer, le gestionnaire d'exception non capturé n'est pas l'endroit où le faire. L'objet qui peut faire la récupération doit l'attraper et le gérer. Les gestionnaires d'exception typiquement non capturés font ce que vous avez fait (ils ne quittent pas toujours, mais ils peuvent).
AW..Je voir..so, j'étais Wright en utilisant le gestionnaire d'exception non capturé juste pour enregistrer le problème, affichez le message que l'application fermera et fermera l'application?
Oui, c'est l'utilisation typique.
Bien que je n'ai pas de chiffres, je ne crois pas que la capture d'essais a un impact significatif sur la performance (pas que j'ai vu). Je pense que si vous ne courez pas à de nombreuses exceptions près, l'impact de la performance ne sera fondamentalement rien. Mais dans tous les cas, il est préférable de veiller à la mise en œuvre correctement de la mise en œuvre du code et d'obtenir de bonnes performances seconde - beaucoup plus facile à faire la seconde une fois la première fois. p> li>
Je pense que la classe d'exception devrait être spécifique quant à l'exception vraiment. Le problème que j'ai avec les sqlexceptions de Java est qu'ils ne vous donnent aucune information sur ce qui a vraiment mal tourné. Printemps utilise un ensemble d'exceptions de base de données plus descriptives (exceptions d'impasse, exceptions d'intégrité des données, etc.) de cette façon de dire quel était le problème. P> li>
Les exceptions vérifiées peuvent être ennuyeuses, mais je ne pense pas qu'ils sont toujours mauvais. Par exemple, le ressort utilise des exceptions non cochées pour les erreurs de base de données, mais je les vérifie toujours et 1) les gérer, si possible, si possible, ou 2) enveloppez une exception plus générale que le composant a échoué. P> li>
Malheureusement, je ne peux pas penser à de bonnes exceptions spécifiques. Cependant, comme je l'ai dit, j'ai trouvé des règles d'exception du printemps pour être utiles et pourtant pas gênantes, alors peut-être que vous pourriez peut-être regarder des documents de printemps. Les classes de base de données de printemps sont un bon exemple. P> li> ol>
Ok, supposons que je ne connais pas le printemps (c'est sur mon Todo, maintenant). Et si la méthodata rencontre une exception et j'utilise une exception décochée pour faire face à cela? Devrais-je utiliser un test si l'exception générée est cochée ou non cochée? (En supposant que différentes actions soient nécessaires) comme tester un ex avec une instance de?
- en utilisant une capture d'essai excessive () a un impact négatif sur la performance? LI> ul> blockQuote>
Cela ressemble à une micro optimisation et, si cela a vraiment un impact sur la performance, vous devrez traiter de nombreux problèmes de performance plus importants avant de faire face à celui-ci. p>
- Utiliser des types d'exception spécifiques est meilleur? Et si je manquais d'attraper l'un des types d'exceptions cibles possibles? Franchement, j'ai entendu et utiliser seulement 10%, je pense aux exceptions standard de Java, en 2-3 ans. Oui, quelqu'un a dit que si l'appelant ne savait pas comment traiter les exceptions piégées, il ne devrait pas avoir le droit d'appeler la méthode de lancement. Est-ce correct? Li> ul> blockQuote>
Je ne suis pas sûr de comprendre la question mais je dirais: "Si vous ne savez pas quoi faire avec une exception, re-jetez-le". P>
- J'ai lu cet article d'Anders Hejlsberg, affirmant que des exceptions vérifiées sont mauvaises. Devrait-il indiquer que la déglutition d'exception pratique est informée dans certains cas? li> ul> blockQuote>
enfer non. Cela signifie simplement qu'une exception non cochée doit être préférée dans certains cas, en particulier lorsque l'utilisateur ne saura pas quoi faire avec une exception vérifiée (exception par exemple SQL), ou s'il n'y a pas de récupération possible, ... P>
- Une image vaut 1000 mots..Je devinez quelques exemples aidera beaucoup ici. Li> ul> blockQuote>
ressort
dataAccessException code> est un très bon exemple. Vérifiez le chapitre 10. DAO Support . P>
L'utilisation de types d'exception spécifiques est meilleure? - voici ce que je voulais dire attraper (exception e) {// faire quelque chose - 90% des cas en enregistrant les détails et renvoient la valeur de la méthode par défaut} ou attrape (arabayindexoutofbounds AOB) {// Journal de la valeur de la méthode de défaut d'exception AOB } Catch (sqlexception e) {// Log the exception Détails Valeur par défaut de retour} Si, à l'aide du 2e scénario, une nullpoinpointException a eu lieu et je n'ai pas écrit de code pour cela? Utiliser une exception aurait attrapé la NullpointException ...
Hmm..Je aurait formaté que..mais les boutons magiques ne sont pas visibles :-(
Oh, d'accord, je vois maintenant. Je préfère généralement attraper les exceptions les plus spécifiques. Mais parfois, je attrape un plus générique. Tout simplement pas attraper (lancable t) code>, surtout si vous ne savez pas ce que vous faites. Les NPE sont des bugs, ils ne devraient pas se produire et doivent être fixés.
Question stupide n ° 1: Qu'est-ce que NPE? :-) Stupide question n ° 2: est-il nécessaire de choisir la réponse la plus satisfaisante? Honnêtement, toutes les réponses m'a aidé à comprendre les principes ici et je suis maintenant quelque part, comme le contraire de la place initiale appelée inconnue, quand j'ai demandé à ma question initiale.
Il n'y a pas de questions stupides, seulement des réponses stupides. Question n ° 1: NPE signifie nullpointException code>. Question n ° 2: Eh bien, vous pourriez peut-être attendre un peu pour voir comment la communauté valorise les réponses en votant, mais vous b> êtes-vous avec des attentes et la décision finale est à vous :)
Oui, j'ai eu cette réponse de Nawaman qui était absolument fantastique. Concise, avec code ci-joint pour faciliter la compréhension ..C'est super. Je suis également reconnaissant à toutes les personnes qui ont répondu.. et si je peux dire que ... Ce site Web est l'une des meilleures choses que j'ai vues en ligne jusqu'à présent.. et j'ai vu beaucoup :). Bon travail.
Une fois quand j'étais au collège, un étudiant a dit: "C'est probablement une question stupide, mais ..." à quel point le professeur interrompit et dit: "Il n'y a pas de questions stupides. C'est juste les gens qui leur demandent." :-)
Je pense que c'est la seule chose que le professeur a dit que je me souviens encore.
Valeur de retour vs. Jouant une exception
La différence fondamentale entre une exception et une valeur de retour est que la valeur de retour est livrée à votre appelant immédiate, alors qu'une exception est livrée à une clause de capture n'importe où dans la pile d'appels. Cela permet de réutiliser le même gestionnaire d'exception pour de nombreux types d'exceptions différentes. Je vous recommande de favoriser des exceptions sur les codes de retour si et seulement si vous avez besoin de cette fonctionnalité. P>
Impact de la performance. P>
Chaque instruction a un effet négatif sur les performances, y compris celles des blocs de captures. . Cependant, tout processeur moderne peut lancer et gérer des millions d'exceptions par seconde, donc si vous ne jetez pas des milliers d'entre eux, vous ne remarquerez rien. P>
exceptions spécifiques p>
pour lancer, soyez spécifique pour permettre une manipulation spécifique. Pour la manipulation, vous pouvez être générique, mais vous devez être conscient que des exceptions arbitraires peuvent être livrées à votre gestionnaire, y compris celles non cochées non déclarées par vos callees. P>
coché p>
Le débat rage Si des méthodes doivent utiliser des exceptions vérifiées ou non cochées. Jamais juste avaler une exception. Gérer ou retirent-le. Il simplifie la maintenance si vous ne supprimez pas les preuves sur les échecs. P>
exemple p>
Une application que j'ai travaillé sur récemment reçoit des commandes sur le réseau qu'il exécute ensuite. Cela implique généralement une interaction supplémentaire avec les systèmes distants, ce qui pourrait échouer pour une foule de raisons. Les méthodes pour effectuer la commande ne captent aucune exception, laissant ainsi la bulle de la pile d'appels au gestionnaire d'exception central de l'auditeur de commandement, qui suit: p> Nous n'avons intentionnellement pas attrapé et retire des exceptions dans la logique de traitement, comme nous l'avons estimé que cela aurait ajouté aucune valeur. P> p>
Valeur de retour vs. Lancer une exception
Je connecte toujours les "événements" comme celui-ci dans le journal. La question avec la valeur retournée était de..quipe devrais-je retourner? Si le type de méthode renvoie des chiens d'objet et une erreur, devrais-je renvoyer NULL, ou un nouveau chien ()? Ceci est important, en tant que principe général.
Exceptions spécifiques: Case1. Méthode1 lance E1, E2, E3. Méthode2 Catches E1, E3. D'une manière ou d'une autre, je pense qu'il est faux que E2 soit traitée, mais pas attrapé. Cas2. Méthode1 lance exc. Méthode2 Catchs EX1, EX2, mais EXC est de type EX3, donc pas attrapé par l'appelant.
Quelle que soit la valeur que vous retournez pour indiquer une erreur, l'appelant devra probablement être vérifiée, la valeur renvoyée doit donc être facilement distinguée d'une valeur de retour indiquant le succès. Je retournerais donc null plutôt qu'un nouveau chien.
Nous nous assurons que chaque exception est traitée en ayant une prise (exception) dans la méthode de chaque thread. Ceci est nécessaire pour ces exceptions Personne n'a anticipé, par exemple une nullpoinpointException lancée en raison d'un bug. Avec ce gestionnaire en place, nous estimons qu'il est correct de ne pas attraper des exceptions dans la logique commerciale à moins que nous puissions faire quelque chose de plus significatif à leur sujet là-bas.
Merci, l'échantillon de code et la mort du nouveau chien () sont faciles à comprendre pour moi. C'est beaucoup plus clair pour moi maintenant sur l'utilisation de la question dans le contexte de ma question.
SE-Radio a fait un épisode de podcast sur ce sujet de ce sujet de Traitement des erreurs qui explique une certaine philosophie sur la manière d'utiliser des exceptions, ce qui peut être retraité comme "où les absorber". P>
La principale chose que j'ai retenue est que la plupart des fonctions doivent les laisser buller et la plupart des détails des exceptions doivent se retrouver dans un fichier journal. Ensuite, les fonctions ne réussissent que des messages globaux disant que quelque chose s'est passé. P>
En un sens, cela conduit à une sorte de hiérarchie d'exception: une pour chaque couche de code. p>
Comme je pense qu'ils ont dit, il n'a pas de sens d'expliquer à l'utilisateur que ce cluster de DB a échoué car le DNS était indisponible, ou parce que le disque était plein. À ce niveau, quelque chose qui ne pouvait pas permettre de compléter la transaction, c'est tout l'utilisateur doit savoir. P>
Bien sûr, les développeurs / administrateurs seront heureux de voir plus de détails, c'est pourquoi à la couche de DB, les exceptions spécifiques doivent être enregistrées. P>
Je suis entièrement d'accord avec cela. Avoir 100 étapes à effectuer, chacun avec au moins 1 explication technique de ce qui s'est mal tourné ne sonne pas comme amusant pour l'utilisateur..so, enregistrer toujours les détails et le jeter plus loin..mais ne signifie pas que l'application pourrait Pas de fermeture, si la couche supérieure ne fait aucun effort pour gérer cela.
L'application ne devrait fermer que s'il s'agit de la meilleure option, qui ne devrait pas aller sans l'application qui notifie au moins l'utilisateur qu'elle sait que cela vient de se bloquer. C'est le travail de la plus haute couche (l'application) de traiter des exceptions. Les couches inférieures ne les jettent que, regroupez-les en moins d'exceptions, ou peut-être leur loger. Soyez critique, car je n'ai pas encore trop d'expérience, et peut-être que ce que je dis n'est pas réaliste ... mais les gars de la radio se savent mieux que moi :).
Ok, je vais essayer de critiquer :-). Je me souviens de quelqu'un ici, je pense dire une fois qu'il n'aimerait pas toutes les exceptions qui fuyaient la main. Et j'ai tendance à être d'accord avec ça. Je pense qu'au moins certains des problèmes devraient être traités sur "sur site".
Exception est là pour que le programmeur d'une tâche n'a pas à gérer le problème par lui-même. (1): au cas où le problème ne lui est pas logique de gérer la tâche. Une tâche de lecture d'une chaîne d'un flux ne doit pas gérer l'erreur de disque, n'est-ce pas. Mais il devrait être très logique de gérer si les données ne contiennent pas de chaîne.
(2): il ne peut pas le gérer par lui-même (pas assez d'informations) Une tâche de lecture d'une chaîne d'un fichier et d'un fichier non trouvé peut demander à l'utilisateur de sélectionner un autre fichier, mais comment la tâche peut-il maintenant quel dossier le fichier pourrait être quelle extension le fichier pourrait être. Sans savoir que, comment la tâche peut-elle créer une interface graphique de ré-demandez-la. P>
(3): il n'y a pas de moyen logique (ou gérable) de distinguer entre un retour différent. Si une tâche ne peut pas lire le fichier et renvoyer null. Qu'en est-il de si le fichier dans le mauvais format, renvoyez aussi NULL? Comment ces deux peuvent-ils diffèrent? Des exceptions peuvent être utilisées pour différer cela. C'est pourquoi cela s'appelle une exception :-d. P>
(4): Il existe de nombreuses tâches similaires nécessitant une manipulation et une écriture similaires que dans toutes les tâches sont difficiles à maintenir. Ecrire le code de la poignée pour tous les accès peut être un gâchis car vous pouvez avoir besoin de nombreuses duplications. P>
for(int i = 0; i < Users.length; i++) { User aUser = Users[i]; // Do something with user } Replaced with try { for(int i = 0; ; i++) { User aUser = Users[i]; // Do something with user } } catch(ArrayOutOfBoundException AOBE) {}
Evrika! Tu as mon vote, mec :-). C'était exceptionnel ... merci beaucoup.
Juste quelques commentaires que je veux faire ici. Dans le premier exemple de Catch, la monnaie arrayindexoutofboundsException et ne rien faire n'est pas une bonne pratique. Vous ne saurez jamais si cette exception se produit. De plus, le retour de NULL peut être dangereux de la méthode qui renvoie une collection / une matrice. Maintenant, l'appelant doit vérifier si (utilisateur == null). Il serait préférable de retourner un tableau vide.
Vous avez raison de ce que jeff. L'exemple est juste qu'un exemple.
Droite, je voulais juste noter particulièrement celui des exceptions à propos de cette publication sur les exceptions.
Je dirais, en ce qui concerne le "code de remplacement" au-dessus de celui utilisant quelque chose comme la fin de la longueur d'intfinie = users.length and to (int i = 0; i
Eh bien, en ce qui concerne le problème de la longueur. La raison pour laquelle cela peut être intéressant est que vous n'avez pas besoin de vérifier si je suis au-delà de la longueur ou non. Java vérifie que derrière la scène de toute façon. Si vous bouclez beaucoup de rondes. Le coût d'exception vaut le coût de la vérification. Et comme je dis que c'est un exemple. Vous pouvez utiliser la même idée lorsque la vérification coûte beaucoup plus cher.
De plus, la maintenabilité est également plus importante que l'optimisation, donc je suis d'accord sur le fait que ce n'est pas ce que de nombreuses personnes utiliseront.
Beaucoup de bonnes réponses, laissez-moi simplement ajouter quelques points qui n'ont pas été mentionnés. P>
Pour beaucoup, probablement la plupart des exceptions que je crée, la seule chose que le programme peut effectuer de manière réaliste est d'afficher un message d'erreur et donne à l'utilisateur la possibilité de changer ses entrées et de réessayer. La plupart des erreurs de validation - Format de date non valide, non-chiffres dans un champ numérique, etc --fall dans cette catégorie. Pour ceux-ci, je crée un type d'exception unique, que j'appelle habituellement "BadinputException" ou "validationException", et j'utilise la même classe d'exception dans tout le système. Lorsqu'il y a une erreur, je jette une nouvelle badinputException ("montant ne doit contenir que des chiffres") 'ou d'une autre, puis d'afficher l'appelant et laissez l'utilisateur réessayer. P>
D'autre part, si l'appelant est raisonnablement susceptible de faire différentes choses dans différents cas, faites-leur des exceptions différentes. P>
règle facile du pouce: Si vous avez deux ou plusieurs exceptions qui sont toujours traitées avec un code identique et dupliqué, combinez-les en une seule exception. Si votre bloc de capture effectue une vérification supplémentaire pour déterminer quel type d'erreur est vraiment, cela aurait dû être deux (ou plus) classes d'exception. J'ai vu du code qui fait exception.getmessage puis cherche des mots-clés dans le message pour déterminer ce que le problème était. Ceci est laid. Faites plusieurs exceptions et faites-la bien. P>
(a) Il évite le problème des valeurs de retour "magique", comme une chaîne non nulle est une vraie réponse, mais Null signifie qu'il y avait une erreur. Ou pire, "NF" signifie que le fichier non trouvé, "nv" signifie format invalide, et tout autre est la réponse réelle. Avec des exceptions, une exception est une exception et une valeur de retour est une valeur de retour. P>
(b) Les exceptions ignorent parfaitement la ligne principale du code. Habituellement, lorsqu'il y a une erreur, vous voulez sauter un tas de traitement qui n'a pas de sens sans données valides et d'aller à droite pour afficher un message d'erreur et quitter, ou réessayer l'opération, ou tout ce qui est approprié. Dans les mauvaises vieilles matrices, nous écririons "goto panique-avort". Les gotos sont dangereux pour toutes les raisons qui ont été beaucoup discutées. Les exceptions éliminent ce qui était peut-être la dernière raison restante d'utiliser un goto. P>
(c) peut-être un corollaire à (b), vous pouvez gérer le problème au niveau approprié. Parfois, lorsqu'une erreur se produit, vous souhaitez réessayer exactement la même fonction - comme une erreur d'E / S peut représenter un problème de communication transitoire. À l'autre extrême, vous pourriez avoir dix niveaux profondément dans les sous-programmes lorsque vous obtenez une erreur qui ne peut être traitée de quelque manière que ce soit de la bombardement de l'ensemble du programme et de l'affichage d'un "désolé, ArmagedDon est survenu, tout le monde ici est mort". Avec des exceptions, il est non seulement facile de choisir le niveau correct, mais vous pouvez faire des choix différents dans différents modules. P>
C'était une réponse géniale. InputException verra la lumière du jour dès que possible. Je n'utiliserai jamais les valeurs de retour des codes d'erreur au lieu d'exceptions. Mais..assumé ceci: J'essaie d'extraire des données de DB et de conserver les données de la collection Java. Si tout va bien, mais il n'y a pas de résultats, devrais-je retourner une nouvelle collection Java ou une valeur null? Je sais que je peux faire les deux et avoir à l'esprit quoi faire avec ça, mais quelle est la meilleure pratique ici? Merci.
Sans plus de détails, mon intestin sentier serait: si "aucune donnée" est une condition valide et peut être facilement traitée dans la ligne principale du code, puis je retournerais null. Si c'est une condition d'erreur - pas nécessairement, une "base de données s'est écrasé" mais "il devrait y avoir des données et il n'y a pas" - alors j'en ferais une exception. Franchement, si l'appel et la fonction étaient dans mon propre code, je vais baser la décision sur ce que je veux faire quand cela se produise. Si c'est un module générique qui sera utilisé par le code, je n'ai pas écrit, que je le basais sur ce qui semble logique dans le contexte.
S'il vous plaît, ne retournez pas NULL en cas d'erreurs non fatales. Renvoie une nullobject à la place. P>
Sinon, vous avez besoin d'une vérification nulle après chaque appel à votre code qui est une douleur, et si oublié fera tomber le code. P>
Qu'est-ce qu'un nullobject? En supposant que les scénarios: 1. J'utilise une base de données Sélectionnez, mais il n'y a aucun résultat. Retour suggestible: nouvel objet du type de retour de méthode (vecteur, tableau, objet, etc.). 2. J'utilise une base de données SELECT, mais une erreur ou une exception est survenue. Devrais-je retourner une valeur nulle, un NullObject (du type de retour de méthode) ou un nouvel objet (de type de retour de méthode)? Devrais-je faire ou non la différence entre: a) la sélection a des résultats; b) Le Select était mauvais / incompatible avec la base de données, par conséquent, aucun résultat n'est là.
Pour une demande de base de données, un ResultSet EMTPY serait une excellente suggestion si tout ce que vous voulez faire avec elle est itérer sur elle. Mais comment différentinez-vous entre ces conditions si vous venez de retourner NULL en premier lieu?
Je me suis documenté à propos de NullObjects..Il y a beaucoup de bruit dans le monde à leur sujet, et dans certains cas, ils sont utiles, un terme plus explicite aurait dû être "videobject" ou même "JokerObject" :-), en tant que NullObject est capable de substituer tout autre objet de son genre. Merci d'avoir introduit le terme à moi et aux lecteurs qui n'étaient pas au courant de son existence.
Par le chemin..J'ai une question non liée. Je vois que mon message a été édité par Pascal Thivent il y a quelques minutes. Est-ce un individu ou un script? :-) Désolé mec si tu n'es pas un script.. et merci de formater le code.
Ce n'est probablement pas un script. Les utilisateurs privilégiés peuvent modifier les articles d'un autre sur Stackoverflow
Ouais, je suis un script (et je te regarde).
Drôle, mais ne soyez pas méchant avec les débutants!
:-)) Je suis ravi d'avoir de telles réactions rapides ici..so..Je espère que vous allez regarder ..