Vide blocs catch
J'ai parfois dans des situations où j'ai besoin d'attraper une exception si jamais elle est levée, mais ne jamais rien faire avec elle. En d'autres termes, une exception peut se produire, mais il n'a pas d'importance si elle n'.
J'ai lu récemment cet article à propos d'une chose semblable: http://c2.com/cgi/wiki?EmptyCatchClause
Cette personne parle de comment le commentaire de
//should never occur
est une odeur de code et ne doit jamais apparaître dans le code. Ils ont ensuite aller sur expliquer comment le commentaire
//don't care if it happens
est tout à fait différent et je lance dans des situations comme ça moi. Par exemple, lors de l'envoi d'e-mail-je faire quelque chose de similaire à ceci:
var addressCollection = new MailAddressCollection();
foreach (string address in addresses)
{
try
{
addressCollection.Add(address);
}
catch (Exception)
{
//Do nothing - if an invalid email occurs continue and try to add the rest
}
}
Maintenant, vous pouvez penser que cela est une mauvaise idée puisque vous voulez revenir à l'utilisateur et d'expliquer que l'un ou plusieurs des messages n'a pas pu être envoyé au destinataire. Mais si c'est juste un CC adresse? C'est moins important et vous pouvez toujours envoyer le message de toute façon, même si l'une de ces adresses n'était pas valide (peut-être juste une faute de frappe).
Donc suis-je en droit d'utiliser un vide bloc catch ou est-il une meilleure alternative que je ne suis pas au courant?
- Comment savez-vous que
Exception
est liée à la CC de l'adresse, et pas par exemple à sortir de l'état de la mémoire? comment comptez-vous rétablir? - Dans votre exemple, je serais encore faire quelque chose, à l'exception bien, même juste journalisation elle - même ne pouvez pas donner à l'utilisateur le choix de savoir quoi faire avec l'échec des adresses e-mail, mais l'enregistrement de sorte que vous savez ce qui s'est passé, c'est bien aussi.
- Je soupçonne l'intention de l'auteur était qu'un commentaire en disant: "Cette erreur ne devrait jamais se produire" implique que le codeur n'a pas pensé que faire si l'erreur défie les attentes et se produit de toute façon. Le deuxième commentaire est "mieux", mais une bien meilleure serait d'expliquer pourquoi vous n'avez pas de soins sur l'erreur. En fin de compte, la meilleure gestion des exceptions dépend de ce que votre demande est censé faire. Avaler une exception avec aucune autre action n'est acceptable dans certaines circonstances. Dans d'autres, vous devrez ouvrir une session en premier, et dans certains cas, vous avez réellement besoin pour tenter une récupération.
- Merci pour les commentaires. Je suis d'accord avec vous que je devrais être à attraper les exceptions spécifiques en rapport de format d'adresse et de laisser les autres de la bulle vers le haut. Je vais faire ce changement
- Même si nous supposons que nous ne se soucient pas parce que l'e-mail n'est pas valide, il est bon de journal de l'exception et de prendre note de la non valides e-mail. Vide exception est juste une excuse pour les paresseux de la programmation.
- Je pense que tu veux dire "exemple de" au lieu de "excuse"
Vous devez vous connecter pour publier un commentaire.
Vous êtes complètement droit d'utiliser un vide bloc catch, si vous voulez vraiment ne rien faire lorsqu'un certain type de l'exception se produit. Vous pouvez améliorer votre exemple par l'attraper seulement les types d'exceptions qui vous attendre de se produire, et que vous savez qu'ils sont sûrs de les ignorer. En attrapant
Exception
, vous pouvez masquer les bugs et rendre plus difficile pour vous-même pour déboguer votre programme.Une chose à garder à l'esprit en ce qui concerne la gestion des exceptions: il y a une grande différence entre les exceptions qui sont utilisés pour signaler une condition d'erreur externe à votre programme, qui est devrait arriver au moins parfois, et les exceptions qui indiquent une erreur de programmation. Un exemple de la 1ère serait une exception indiquant qu'une adresse e-mail ne pouvait pas être livré en raison de l'expiration du délai de connexion, ou un fichier n'a pas pu être sauvé parce qu'il n'y a pas d'espace disque. Un exemple de la 2ème serait une exception indiquant que vous avez essayé de passer le mauvais type d'argument à une méthode, ou que vous avez essayé d'accéder à un élément de tableau en dehors des limites.
Pour le 2ème (erreur de programmation), ce serait une grosse erreur juste "d'avaler" les exception. La meilleure chose à faire est généralement de connecter une trace de la pile, puis pop up un message d'erreur indiquant à l'utilisateur qu'une erreur interne s'est passé, et qu'ils devraient envoyer leurs journaux pour les développeurs (c'est à dire vous). Ou pendant le développement, vous pouvez simplement faire imprimer une trace de la pile de la console et de planter le programme.
Pour le 1er externe (problème), il n'y a pas de règle sur ce qu'est la "bonne" chose est à faire. Tout dépend des détails de la demande. Si vous souhaitez ignorer un certain état de santé et continuer, puis le faire.
EN GÉNÉRAL:
Il est bon que vous lisez des livres et des articles. Vous pouvez apprendre beaucoup de le faire. Mais s'il vous plaît rappelez-vous, comme vous le lisez, vous trouverez beaucoup de conseils de gens qui disent qu'en faisant telle ou telle chose est toujours mal ou toujours droit. Souvent, ces opinions frontière sur la religion. JAMAIS croire que faire les choses d'une certaine manière, elle est absolument "droit" à cause d'un livre ou d'un article (ou une réponse sur SO... <toux>) vous l'a dit. Il y a des exceptions à chaque règle, et les gens qui écrivent ces articles ne connais pas les détails de votre demande. Vous n'. Assurez-vous que ce que vous lisez un sens, et si ça ne marche pas, faites-vous confiance.
Un vide bloc catch est très bien au bon endroit - si à partir de votre échantillon, je dirais que vous devriez cetagorically PAS utiliser
catch (Exception)
. En revanche, vous pouvez intercepter l'exception explicite que vous vous attendez à se produire.La raison pour cela est que, si vous avalez tout, vous fera avaler les défauts que vous n'attendiez pas, trop. Il y a un monde de différence entre "je ne peux pas les envoyer à cette adresse e-mail" et "votre ordinateur est hors de l'espace disque." Vous ne voulez pas continuer à essayer de vous envoyer la prochaine 10000 mails si vous êtes hors de l'espace disque!
La différence entre "ne devrait pas arriver" et "ne se soucient pas si il arrive", c'est que, si elle "ne devrait pas arriver", puis, quand il ne arriver, vous ne voulez pas avaler en silence! Si c'est une condition que vous ne jamais se produire, en règle générale, vous voulez que votre application crash (ou au moins mettre fin à proprement journaux et abondamment ce qui s'est passé), de sorte que vous pouvez identifier cette condition impossible.
Si une exception ne doit jamais être jeté alors il n'y a pas de point de l'attraper, il devrait n'arrive jamais, et si elle ne vous devez savoir à ce sujet.
Si il y a des scénarios qui peuvent causer une défaillance que vous êtes OK avec alors vous devez les attraper et de les tester pour ceux des scénarios spécifiques et renvoyer dans tous les autres cas, par exemple
Noter que le code ci-dessus, les captures spécifiques (cas fictif) des exceptions plutôt que de l'attraper
Exception
. Je pense que très peu de cas où il est légitime de catchException
par opposition à la capture de certains type d'exception que vous vous attendez à être jetés.throw
devrait probablement être dans uneelse
bloc...Beaucoup d'autres réponses à donner de bonnes raisons quand il serait ok pour intercepter l'exception, toutefois, de nombreuses classes de soutien des moyens de ne pas jeter l'Exception à tous.
Souvent, ces méthodes ont le préfixe
Try
en face d'eux. Au lieu de lancer une exception, la fonction renvoie un Booléen qui indique si la tâche réussi.Un bon exemple de ceci est Analyser vs TryParse
Si vous essayez de la fonction ci-dessus dans une boucle et de la comparer avec sa Parse + Prise equilvilant la méthode TryParse sera beaucoup plus rapide.
À l'aide d'un vide bloc catch juste avale l'Exception, je serais toujours la poignée, même si c'est de vous qu'une
Exception
s'est produite.Aussi attraper le générique
Exception
est une mauvaise pratique en raison du fait, il peut cacher des bugs dans votre application. Par exemple, vous avez peut-être pris unArgumentOutOfRange
exception que vous ne savais pas ce qui se passait et puis avalé (I. e. rien fait avec elle).