89 votes

Quand et comment dois-je utiliser la gestion des exceptions?

Je lis à propos de la gestion des exceptions. J'ai obtenu quelques informations sur ce que la gestion des exceptions, mais j'ai quelques questions:

  1. Lors de la levée d'une exception?
  2. Au lieu de lancer une exception, peut-on utiliser une valeur de retour pour indiquer l'erreur?
  3. Si je protège tous mes fonctions par les blocs try-catch, n'est-ce pas réduire les performances?
  4. Lors de l'utilisation de la gestion des exceptions?
  5. J'ai vu un projet où chaque fonction dans ce projet contenait un bloc try-catch (c'est à dire le code à l'intérieur de l'ensemble de la fonction est entouré par un bloc try-catch). Est-ce une bonne pratique?
  6. Quelle est la différence entre try-catch et __ _ _ essayez __sauf?

107voto

Septagram Points 2230

Ici est assez complet guide sur les exceptions qui, je pense, est à Lire absolument:

Les Exceptions et les erreurs de manipulation - C++ FAQ lite

Comme une règle générale de pouce, lève une exception lors de votre programme peut identifier un externe problème qui empêche l'exécution. Si vous recevez des données à partir du serveur, et que les données n'est pas valide, lance une exception. Hors de l'espace disque? Lever une exception. Les rayons cosmiques vous empêcher de l'interrogation de la base de données? Lever une exception. Mais si vous obtenez des données non valides à partir de l'intérieur de votre propre programme - ne jetez pas une exception. Si votre problème vient de votre propre mauvais code, il est préférable d'utiliser Affirme pour se prémunir contre elle. La gestion des exceptions est nécessaire pour identifier les problèmes que le programme ne peut pas gérer et de leur parler de l'utilisateur, car l'utilisateur peut les manipuler. Mais les bugs dans votre programme ne sont pas quelque chose que l'utilisateur peut manipuler, donc le programme s'écraser dira pas beaucoup moins que la "Valeur de answer_to_life_and_universe_and_everything n'est pas 42! Cela ne devrait jamais arriver!!!!11" l'exception".

Intercepter une exception où vous pouvez faire quelque chose d'utile, comme, afficher une boîte de message. Je préfère attraper une exception une fois à l'intérieur d'une fonction en quelque sorte des poignées de saisie de l'utilisateur. Par exemple, l'utilisateur appuie sur le bouton "Anéantir tous les hunams", et à l'intérieur de annihilateAllHunamsClicked() de la fonction, il y a un bloc try...catch pour dire "je ne peux pas". Même si l'anéantissement de la hunamkind est une opération complexe qui nécessite l'appel de dizaines et de dizaines de fonctions, il y a seulement un try...catch, parce que, pour l'utilisateur c'est une opération atomique - au clic d'un bouton. Exception vérifie dans chaque fonction sont redondantes et laid.

Aussi, je ne peux pas le recommander assez de se familiariser avec RAII - c'est-à-assurez-vous que toutes les données est initialisée est automatiquement détruite. Et qui peut être atteint par l'initialisation autant que possible sur la pile, et quand vous en avez besoin pour initialiser quelque chose sur le tas, utilisez une sorte de pointeur intelligent. Tout initialisé sur la pile sera détruit automatiquement lorsqu'une exception est levée. Si vous utilisez C-style muet pointeurs, tu risques de fuite de mémoire lorsqu'une exception est levée, car il n'y a personne pour les nettoyer à l'exception, bien sûr, vous pouvez utiliser le C-le style des pointeurs, comme les membres de votre classe, mais assurez-vous qu'ils sont pris en charge dans le destructeur).

13voto

Yttrill Points 2461

Les Exceptions sont utiles dans une variété de circonstances.

Tout d'abord, il y a certaines fonctions où le coût de calcul de la pré-condition est si élevé qu'il est mieux de faire le calcul et abandonner avec une exception si elle est trouvée, la pré-condition n'est pas remplie. Par exemple, vous ne pouvez pas inverser une matrice singulière, cependant pour calculer si il est singulier vous calculer le déterminant qui est très cher: il peut être fait à l'intérieur de la fonction, de toute façon, si juste "essayer" à l'inversion de la matrice et signale une erreur si vous ne pouvez pas par la levée d'une exception. C'est avant tout une exception, comme le négatif de la pré-condition d'utilisation.

Puis il y a d'autres cas où votre code est déjà complexe et en passant les informations d'erreur jusqu'à l'appel de la chaîne est difficile. C'est en partie parce que le C et le C++ ont brisé la structure de données modèles: il y en a d'autres, de meilleures façons, mais le C++ ne les supporte pas (comme l'utilisation de monades en Haskell). Cette utilisation est, fondamentalement, je ne pouvais pas être pris la peine de le faire donc je vais jeter une exception: ce n'est pas de la bonne façon, mais c'est pratique.

Ensuite, il est la principale utilisation des exceptions: le signaler lors de la externe pré-conditions ou les invariants, tels que suffisamment de ressources comme la mémoire ou l'espace disque, ne sont pas disponibles. Dans ce cas, vous aurez généralement à la fin du programme, ou d'un paragraphe, et l'exception est un bon moyen de transmission d'informations sur le problème. Les Exceptions C++ ont été conçus pour signaler des erreurs qui empêchent le programme continue.

La gestion des exceptions modèle utilisé dans la plupart des langues modernes, notamment en C++ est connu pour être brisées. C'est largement trop puissant. Les théoriciens ont élaboré des meilleurs modèles que l'complètement ouvert "jeter quoi que ce soit" et "peut-être et peut-être de ne pas l'attraper" modèle. En outre, à l'aide des informations de type de classer les exceptions n'était pas une très bonne idée.

Donc, la meilleure chose que vous pouvez faire est de lancer des exceptions avec parcimonie, quand il y a une erreur réelle, et quand il n'y a pas d'autre moyen de traiter avec elle, et attraper les exceptions à proximité de les jeter possible.

3voto

Sushan M Points 31

Meilleur lire pour ce

La gestion des exceptions a été parlé beaucoup au cours de la dernière décennie et demie. Cependant, malgré un consensus général sur la façon appropriée de traiter les exceptions, une fracture de l'utilisation continue d'exister. Une mauvaise gestion des exceptions est facile à repérer, facile à éviter, et est un code simple (le développeur) de mesure de la qualité. Je sais de règles absolues venir aussi près d'esprit ou exagéré, mais en règle générale, vous ne devriez pas utiliser try/catch

http://codebetter.com/karlseguin/2010/01/25/don-t-use-try-catch/

2voto

user550830 Points 11

1.Une exception case est inclus dans le code lorsqu'il y a une possibilité d'obtenir une exception comme un résultat, ou quelque part entre le problème.

2.Utilisation bloc try-catch avec seulement les cas où il est nécessaire. L'utilisation de chaque bloc try-catch ajouter une condition supplémentaire de vérifier ce qui diminue certainement l'optimisation du code.

3.Je pense que _try_except est un nom de variable valide....

0voto

user475443 Points 111

Il est également intéressant "shoot-out" de différents styles à http://c2.com/cgi/wiki?ExceptionHandlingChallenge

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X