Attraper deux exceptions près dans le même bloc catch?
J'ai une méthode qui peut lancer deux exceptions près, CommuncationException
et SystemException
. Dans les deux cas, je fais la même ligne de bloc de code.
try {
...
}
catch (CommunicationException ce) {
...
}
catch {SystemExcetion se) {
...
}
Est-il possible de le faire comme ça?
try {
...
}
catch (CommunicationException ce, SystemException se) {
...
}
Je ne voudrais pas avoir à écrire ce code. Je sais que je pourrais extrait de la gestion d'exception à une méthode privée, mais étant donné que le code est à seulement 3 lignes de long, la définition de la méthode faudrait plus de code que le corps lui-même.
- Je ne suis pas entièrement sûr que vous voulez de toute façon. N'auriez-vous pas encore la fin, jusqu'à l'écriture de code pour séparer les exceptions -
if (ce...) else (se...)
. En fin de compte, ça peut paraître plus malpropre de toute façon. - Une question similaire existe ici stackoverflow.com/questions/136035/... mais vous pourriez être la capture de la base de
Exception
et que vous souhaitez toujours besoin d'écrire du code pour vérifier le type dérivé deCommunicationException
ouSystemException
... c'est plus de la LDC que votrecatch {} catch {}
, afin de ne pas en valeur la dispute. - Wiseman Non, je n'aurais pas besoin d'un si/d'autre depuis deux exception manipulations sont exactement les mêmes.
Vous devez vous connecter pour publier un commentaire.
En fait, vous pourriez attraper
SystemException
et traiterCommunicationException
trop, parce queCommunicationException
est dérivé deSystemException
Si vous pouvez mettre à jour votre application C# 6 vous avez de la chance. La nouvelle version de C# a mis en œuvre des filtres d'Exception. Vous pouvez donc écrire ceci:
Certaines personnes pensent que ce code est le même que
Mais ses pas. En fait c'est la seule nouvelle fonctionnalité de C# 6 qui n'est pas possible d'émuler dans les versions antérieures. Tout d'abord, une re-jeter signifie plus de ressources que le saut de l'attraper. Deuxièmement, il n'est pas sémantiquement équivalentes. La nouvelle fonction préserve de la pile intacte lorsque vous déboguez votre code. Sans cette fonction, le fichier de vidage sur incident est moins utile, voire inutile.
Voir un une discussion à ce propos sur CodePlex. Et un exemple montrant la différence.
Malheureusement, il n'existe aucun moyen. La syntaxe utilisée est non valide et une chute à travers comme dans un interrupteur d'instruction n'est pas possible non plus. Je pense que vous devez aller avec la méthode privée.
Un peu hacky de contourner ce serait quelque chose comme ceci:
Vous devez décider pour vous-même si ce fait aucun sens.
Non, vous ne pouvez pas le faire de cette façon. Le seul moyen que je connaisse est d'attraper un générique Exception et ensuite vérifier le type de l':
Ce sujet
Double Possible de
Attraper plusieurs exceptions à la fois?
Je cite la réponse ici:
Puisque vous êtes en train de faire le même pour les deux types d'exceptions, vous pouvez tout simplement aller:
Seul hic, explicite les types d'Exception si vous avez besoin de faire quelque chose d'unique pour elle.