Pourquoi est-il préférable de jeter cette exception sur ce général: p> Quel avantage est gagné dans cet exemple particulier ? Le message dis déjà tout. Les sous-classes standard qui héritent de la classe d'exception de base ont-elles déjà différentes méthodes que la base? Je n'ai pas vu de cas, mais je dois admettre que j'ai tendance à jeter l'exception de base. p> p>
8 Réponses :
Le type de l'exception permet aux gestionnaires de l'exception de la filtrer. Si tout ce que vous avez lancé était des exceptions de type Par exemple, si vous lancez toujours Comment l'appelant Il est encore plus inquiétant si vous obtenez un Le code exemple doit être lu: p> Exception code> Comment les gestionnaires sauraient que les gestionnaires peuvent savoir quelles exceptions à attraper et qui permettent de propager la pile d'appels?
exception < / code>: p>
foo code> savoir si une exception null s'est produite ou si le
int32.parse () code> a échoué? Il doit vérifier le type de l'exception lancée (ou faire une comparaison de chaîne méchante). P>
threadabortexception code> ou
OutofMororyException code > Ce qui peut se produire dans les taches que vous ne vous attendriez pas à une exception. Dans ces cas si votre code de capture n'atteint que
exception code> vous pouvez masquer ces exceptions (importantes) et endommager l'état de votre programme (ou système). P>
Pour aller avec cette réponse: le paramètre de message doit être une chaîne lisible par l'homme. Assurez-vous que vous pourrait I> l'analyser lorsque vous attrapez une exception générique, mais c'est des frais généraux que je n'aime pas. Surtout si le message peut changer.
Parce que vous pouvez avoir plusieurs déclarations de capture et gérer différentes erreurs différemment. p>
Par exemple, une exception de divisionbyzero peut inviter l'utilisateur à corriger une entrée, tandis qu'une exception FilenotFound pourrait alerter un utilisateur que le programme ne peut pas continuer et fermer le programme. P>
Il y a un bel article en profondeur répondant à cette question ici: Link P>
Plutôt que de filtrer en fonction du texte d'envoi de texte le long du flux d'erreur, vous pouvez attraper plusieurs types d'exceptions. Chacun peut avoir un moyen très spécifique d'effectuer une récupération. Le texte est juste là pour fournir à l'utilisateur ou à débogger des commentaires, mais le programme se soucie du type d'exception. Pour la même raison, il existe un polymorphisme pour les classes créées par l'utilisateur, il y a des exceptions. P>
Il est beaucoup plus facile d'inclure plusieurs déclarations de capture pour différents types d'exception que d'analyser le texte de message pour comprendre ce qui doit être fait pour gérer correctement le problème. P>
plus analysant le texte du message lorsque son localisé devient presque impossible
Les différentes sous-classes d'exception portent une signification sémantique - une erreur argumentation indique un problème différent d'un problème qui génère une divisionbyzeroexception et le programmeur peut gérer ces problèmes différemment. De plus, les sous-classes peuvent définir des propriétés ou des méthodes supplémentaires pouvant aider à diagnostiquer ou à manipuler le problème, si le programmeur choisit de les utiliser. P>
try { Do(); } catch (MyException) { // reaction on MyException } catch (AnotherException) { // another reaction on AnotherException { // SomeException will not be caught void Do() { if (...) throw new MyException(); else if (...) throw new AnotherException(); else throw new SomeException(); }
Dans une hiérarchie exceptionnelle bien conçue, avoir différents types d'exceptions permettant d'avoir des déclarations de capture qui prennent des mesures différentes dans différentes circonstances. Idéalement, une famille d'exceptions émergerait d'une fonction si l'action particulière ne pouvait être achevée, mais les invariants de classe qui auraient dû être applicables avant que l'action ait été tentée probablement tenue, à l'exception de celles impliquées par l'échec de l'action. Par exemple, la méthode Get-Object d'une collection devrait lancer une exception de cette famille si la collection semble valide mais l'objet demandé n'existe pas. P>
Si une fonction échoue de manière à ce que les invariants de classe ne soient pas tenus lorsqu'il a été appelé, ou ne contiennent plus après son retour, il devrait lancer une exception d'une famille différente. Notez qu'il peut être approprié pour une fonction capturer une exception de la première famille et de Retirhow comme la seconde, si la seule façon dont l'exception serait survenue serait si les invariants ont été violés. Il peut également être approprié à l'occasion d'attraper une exception du deuxième type et de lancer l'une des premières, si les exceptions provenaient d'un objet qui ne seront jamais utilisées après la retouche de la fonction. P>
Si les choses sont vraiment énormes (par exemple, exception exceptionnelle, cpucatchingfireException, etc.) qui devrait être une autre hiérarchie séparée des deux premières. P>
Les exceptions existantes ne suivent pas ce modèle, mais on pourrait l'utiliser pour toutes les nouvelles exceptions que l'on crée. P>
directement à partir de msdn - Manipulation d'exception :
envisager d'attraper des exceptions spécifiques lorsque vous comprenez pourquoi il sera lancé dans un contexte donné. strong> p>
Vous ne devez attraper que ces exceptions que vous pouvez récupérer. Par exemple, un
FilenotFoundException code> résultant d'une tentative d'ouverture d'un fichier inexistant peut être géré par une application car elle peut communiquer le problème à l'utilisateur et permettre à l'utilisateur de spécifier un nom de fichier différent ou Créez le fichier. Une demande d'ouverture d'un fichier qui génère un
exécutenanceeneexception code> ne doit pas être traitée car la cause sous-jacente de l'exception ne peut être connue avec aucun degré de certitude et que l'application ne peut s'assurer qu'elle est prudente de continuer à exécuter. p> blockQuote>
Ne pas trop excuser
Catch code>, car jetant une autre exception à partir d'un bloc de capture réinitialisera la trace de la pile et entraînera la perte des informations de débogage importantes, comme une fois de nouveau MSDN suggère: p>
Ne pas surutiliser. Des exceptions doivent souvent être autorisées à propager la pile d'appels. Strong> p> Accrocher des exceptions que vous ne pouvez pas légitimement gérer les informations critiques de débogage critiques. P> BlockQuote>
À la fin, la prise d'une exception devrait être une exception pour la gestion des exceptions spécifiques que vous vous attendez à survenir sous certains scénarios communs où vous souhaitez enregistrer ou avoir un comportement spécifique lors de la prise d'exception, sinon simplement
Jetez CODE> E-le loin, comme
Eric Lippert Code> recommande lui-même sur son blog (voir
trop de réutilisation code>
article). p>xxx pré> au lieu de: p>
xxx pré> enfin, une exception code> code> n'est pas obligatoire de proposer certaines spécificités en tant que propriétés ou méthodes supplémentaires ou quelle que soit le nom de celui-ci qui sit elle-même, vous permettant de filtrer votre prise sur un type d'exception spécifique. p>
edit # 1 strong> p> Un autre lien intéressant sur la manipulation des erreurs sur l'Eric Lippert's Blog: exceptions vexing . p> p> p >
Une exception est typiquement (1) capturée, enregistrée et rejetée, (2) capturée et manipulée, ou (3) non capturée. P>
Si elle est capturée, connectée et rejetée, il pourrait y avoir d'importantes informations supplémentaires cachées dans un type d'exception spécifique permettant au code de journalisation de jeter des informations plus riches, de sorte que l'analyste qui tente de déboguer le problème que provoqué l'exception peut le faire plus efficacement. P>
S'il est attrapé et manipulé, vous devez savoir comment gérer le problème. Si une exception est d'un type spécifique, il s'agit d'une grande idée du développeur qui écrit le gestionnaire sur le point de s'occuper de l'exception ou non. Vous ne devez gérer que des exceptions que vous attendez et savez comment récupérer. P>
S'il n'est pas attrapé, le processus va diminuer et probablement une décharge de crash va être envoyée quelque part. Maintenant, nous sommes de retour dans le cas (1). P>
Dans les trois cas, il est préférable d'avoir moins d'informations. P>
Parce que vous pouvez attraper des exceptions spécifiques, vous pouvez avoir plusieurs déclarations de capture dans un type de capture.
"Les sous-classes standard que hériter de la classe d'exception de base ont déjà différentes méthodes que la base?": Oui, mais la plupart des réponses ne se sont pas concentrées sur ce point. Découvrez
WebException code> pour un exemple simple de ceci: msdn.microsoft.com/en-us/library/system.net.webexception.asp x . Spécifiquement, prenez note de la propriété code> réponse code>.