7
votes

C # Manipulation d'exception, quelle clause de capture à utiliser?

Dupliqué possible:
attraper des exceptions spécifiques vs génériques en C #

Voici un exemple de méthode xxx

J'aimerais savoir quelle clause d'exception à utiliser à part juste exception et s'il y a un avantage dans en utilisant des clauses de capture plus spécifiques.

EDIT: OK merci tout le monde


0 commentaires

10 Réponses :


7
votes

attraper des types d'exceptions individuels dans votre relevé vous permettra de gérer chacun de manière différente.

une règle de couverture pour exception peut être utile pour les exceptions de journalisation et de réthraines, mais n'est pas Le meilleur pour la manipulation réellement des exceptions que vous pourrez peut-être récupérer de. xxx


0 commentaires

4
votes

Vous ne devriez vraiment pas attraper des exceptions que vous êtes attendre que le code puisse jeter. De cette façon, si cela jette quelque chose que vous ne vous attendiez pas, cela peut être quelque chose de critique; quelque chose qui devrait bousculer la pile d'appel et éventuellement planter l'application; ou quelque chose que vous n'avez pas pensé.

Par exemple, vous pouvez gérer ioException s projeté par code d'E / S afin que vous puissiez relayer le problème à l'utilisateur. Cependant, les mêmes opérations peuvent lancer quelque chose de plus critique, tel qu'un AccessViolationException . Dans ce cas, vous voudrez peut-être que le programme se termine ou gérer le problème d'une manière différente.

La manipulation des exceptions génériques ne doit que vraiment être utilisée dans des cas où vous ne vous souciez pas de l'erreur survenue, puis de ne pas vouloir que cela affecte le reste de votre processus.


0 commentaires

1
votes

Puisque vous avez affaire à un dictionnaire .. alors vous voulez regarder ces 2 exceptions

  • La clé de KeyvaluePair est une référence nulle (rien dans Visual Basic).

  • argumentException Un élément avec la même clé existe déjà dans le dictionnaire (Thkey, Tvalue).

    Exception de KekvaluePair Ceci est pris à partir du site MSDN


1 commentaires

Oh merci de savoir que cela ne le savait pas dans la liste des exceptions possibles sur MSDN



0
votes

Utilisez le type d'exception que vous pourriez vous attendre, mais ne pas être capable de prévenir et que vous pouvez gérer de manière adéquate. Laissez quoi que ce soit d'autre bouillonner quelque part qui pourrait s'y attendre ou peut le gérer.

Dans votre cas ici, je pourrais vous attendre à ce que je rencontre un NullReferenceException si le dictionnaire est null. Mais je ne l'attraperais pas. C'est quelque chose que je peux valider à la place xxx

donc il n'y a donc aucune raison de permettre à une exception de se produire même. N'utilisez jamais d'exceptions pour le flux de contrôle et validez contre les causes connues.


0 commentaires

0
votes

Certaines classes / méthodes lanceront des exceptions différentes, en fonction de l'erreur. Par exemple, vous pouvez utiliser la classe de fichier pour écrire des données dans un fichier. Vous pouvez écrire plusieurs déclarations de capture pour les types d'exception que vous pourriez récupérer, et une exception générique capture à la bûche et à bulles tout ce qui ne peut être récupéré à partir de.


0 commentaires

0
votes

En utilisant une exception, vous attrapez toutes les exceptions. D'entre vous utilisez IoException ou StackoverFlowException Vous n'aurez que des erreurs de ce type.

Un empressementVullowException a été attrapé par une exception toujours maintenir le même message, la trace de la pile, etc.


0 commentaires

2
votes

La seule cause potentielle d'une exception que je vois dans votre exemple est si list code> est null. CommandeByDescendant () Code> doit renvoyer un Inumérable vide code> plutôt qu'une référence null.

Si je lis cela correctement, il pourrait avoir plus de sens à attraper NullReferenceException code>: p> xxx pré>

Cependant, cela dépend vraiment des besoins de votre application. Si votre intention est simplement d'alerter l'utilisateur ou de vous connecter toutes les exceptions, la capture de la classe code> est bien. Si vous avez besoin d'une manipulation spéciale pour différents types d'exceptions, telles que l'envoi d'une alerte de courrier électronique au lieu de simplement enregistrer le message - il est logique d'utiliser des types d'exception spécifiques: P>

try
{
} 
catch(NullReferenceException e)
{
//...
} 
catch(StackOverflowException e)
{
//...
}
catch(Exception e)
{
/// generic exception handler
}


1 commentaires

Si Liste est NULL, sortieDictionaryContentsByScendants devrait lancer argumentNullexception



1
votes

Vous devez toujours attraper des exceptions avec une classe aussi spécifique que possible.

Si vous savez quoi faire si un fichier est verrouillé, mais que vous considérez toutes les autres erreurs comme imprévues et impossibles à gérer, vous devriez attraper system.io.io10ception et faire face à l'erreur. Vous ne devez attraper que exception (ou juste attrape {) pour une sortie gracieusement.


0 commentaires

2
votes

Quelle exception à utiliser dépend vraiment du code dans le bloc d'essai. En général, vous souhaitez attraper des exceptions avec lesquelles vous pouvez faire quelque chose avec et laisser des exceptions que vous n'avez pas de pouvoir surviennent à des niveaux élevés de votre code où vous pouvez effectuer certaines mesures qui font depuis. L'une des erreurs les plus courantes que je vois que les gens font de tenter d'attraper des erreurs qu'elles n'ont aucune capacité à gérer.

Par exemple P>

Void ChoseFile()
{
     try
     { 
         string FileName = GetInputFile()
     }    
     catch( InvalidFileSelectedException ex)
     { 
         //In this case we have some application specific exception 
         //There may be a business logic failure we have some ability 
         //to infomr the user or do an action that makes sense  
     }
     catch(FileNotFoundException exfilenot found)
     { 
         //In this case we can do somthing different the the above 
     }
     catch(Exception ) 
     { 
         //Normal I would not use this case we have an error we don't know what to do 
         //with. We may not have a usefull action.  At best we can log this exception                               
         // and rethrow it to a higher level of the application that can inform the user
         // fail the attempted action.  Catching here would only suppress the failure.
      }

} 


0 commentaires

0
votes

Philosophie de manutention d'exception Je suis sûr que vous pouvez trouver de nombreuses autres philosophies

code de manière défensive. Attraper des exceptions est plus chère que d'empêcher l'erreur en premier lieu.

Ne pas attraper une exception et l'enterrer en ne manipulant pas. Vous pouvez passer de nombreuses heures à essayer de trouver une erreur qui a été supprimée.

Les erreurs de journal que vous attrapez. Cela aide à analyser le problème. Vous pouvez vérifier si plus d'un utilisateur a le même problème Je préfère une base de données pour la journalisation, mais un fichier plat ou le journal des événements conviennent également. La solution de base de données est la plus facile à analyser, mais peut introduire des erreurs supplémentaires.

Si l'erreur est due à des données incorrectes saisies par l'utilisateur, informez-en l'utilisateur du problème et laissez-les réessayer. Permettez toujours une voie d'évacuation s'ils ne peuvent pas résoudre le problème.

attraper l'erreur aussi proche de la source que possible Cela pourrait être une procédure de base de données, une méthode dans une couche d'accès aux données (DAL) ou un autre emplacement.

Gestion de l'exception est différent de la capturer. Vous devrez peut-être repenser l'exception afin qu'elle puisse être traitée plus haut de la pile ou dans l'interface utilisateur.

Retirhing L'exception peut être faite d'au moins deux manières. À jeter seul ne modifie pas la pile. Dresser EX modifier ou ajouter à la pile sans avantage.

Parfois, il est préférable de ne pas attraper une exception, mais laissez-la plutôt la bulle.

Si vous écrivez des services (Web ou Windows) qui n'ont pas d'interface utilisateur (UI), vous devez toujours enregistrer l'erreur. Encore une fois, cela est donc que quelqu'un puisse analyser le journal ou le fichier de base de données pour déterminer ce qui se passe.

Vous voulez toujours que quelqu'un sache qu'une erreur s'est produite.

Avoir beaucoup de déclarations de capture pour un bloc d'essai peut rendre votre code plus difficile à maintenir, surtout si la logique de vos blocs de capture est complexe. Au lieu de cela, code de manière défensive.

N'oubliez pas que vous pouvez avoir essayé de prendre des blocs de capture dans des blocs de capture.

Aussi, n'oubliez pas d'utiliser le bloc enfin le cas échéant. Par exemple, la fermeture des connexions de base de données ou des poignées de fichier, etc.

hth Harv


0 commentaires