2010-06-21 5 views
6

Dans .NET, lors de la capture d'exceptions, dois-je toujours attraper les exceptions dérivées (donc pas ArgumentException mais les types dérivés)?Attraper la plupart des exceptions dérivées?

aussi:

Si on me demande d'utiliser des codes d'erreur, serait-ce dans le constructeur comme si ?:

throw new Exception ("4000", ex);

Ou un type d'exception personnalisé avec une propriété errorcode? (Cela peut être déroutant avec des types d'exception comme SqlException qui ont des codes d'erreur correspondant aux erreurs SQL Server).

Merci

+0

D'où proviennent les codes d'erreur? Ces codes d'erreur natifs Win32 sont-ils les codes d'erreur? –

Répondre

6
  1. Attrapez la plus grande exception que vous savez gérer.

    En général, cela signifie que vous allez attraper une exception assez spécifique. Et certaines exceptions, comme ArgumentException s, ne doivent pas être interceptées du tout, car elles indiquent une erreur de logique par opposition à une erreur d'exécution. Un endroit où j'ai trouvé attraper une plus grande exception utile est dans le cas de File I/O. Un IOException peut être une exception pratique de niveau supérieur à attraper. Si vous êtes invité à utiliser des codes d'erreur, vous pouvez utiliser la propriété message d'une exception pour l'envelopper, mais je ne l'utiliserais jamais comme une raison pour éviter de lancer une exception correctement typée. C'est parce qu'il y a deux préoccupations distinctes ici:

    a. Le code d'erreur est là pour fournir une information spécifique qui peut être consultée en cas de panne sur le terrain. Il ne devrait jamais être utilisé pour distinguer les types d'exception par programme. B/c le langage a une fonction spécifique conçue pour cela: les types d'exception.

    b. L'exception typée de manière appropriée est là pour fournir une manière programmatique de distinguer les exceptions. Le langage est conçu pour cela, utilisez-le. Ne pas jamais jeter un plain Exception.

    Je jetterais probablement un code d'erreur dans le Exception.Data collection. Cela évite d'écraser les messages dans Exception.Message qui seraient autrement très utiles à des fins de diagnostic.

+0

Je ne suis pas sûr qu'il y ait beaucoup de base en général pour considérer ArgumentException comme plus ou moins "sévère" que de nombreux autres types. Ce qu'il faut vraiment savoir quand on attrape une exception, c'est l'état du système (et si la routine qui a jeté l'exception l'a affecté).Si vous essayez par exemple analyser un fichier, je ne suis pas sûr qu'il y ait beaucoup de valeur à valider tous les champs avant d'appeler des routines qui lanceraient ArgumentException si leurs arguments sont invalides, à moins que mon propre code puisse faire quelque chose de plus utile qu'une exception invalide. Donc, je vois à peine que cela implique une "erreur de logique". – supercat

2

Cela dépend si vous voulez attraper une exception exacte ou un groupe de différents types d'exceptions.

Parfois, vous souhaitez ajouter la gestion pour 1 exception exacte seulement. D'autres fois, la gestion des exceptions sera la même pour tout type d'exception, donc vous pouvez juste mettre catch ou juste attraper Exception pour voir quelle est l'exception. Par exemple, vous voudrez peut-être attraper seulement 1 exception exacte et aucune autre gestion d'exception. Vous le feriez quand vous saurez plus loin dans la pile d'appels que vous attrapez le reste des exceptions, mais que vous voulez ignorer juste celui que vous attrapez exactement.

Questions connexes