Le conseil le plus simpliste:
Si vous ne savez pas si vous attrapez ou non une exception, ne l'attrapez pas et laissez-la couler, quelqu'un le fera à un moment donné.
Le point à propos des exceptions est qu'elles sont exceptionnelles (pensez std::bad_alloc
). Mis à part quelques utilisations bizarres pour la "sortie rapide" de blocs de code profondément imbriqués (que je n'aime pas beaucoup), les exceptions ne devraient être utilisées que lorsque vous remarquez quelque chose que vous n'avez aucune idée de comment faire.
Reprenons les exemples:
file = open('littlefile.txt', open.mode.Read)
Il ne semble évident, pour moi, que cela peut échouer, et dans un certain nombre de conditions. Bien qu'il soit important de signaler la cause de l'échec (pour un diagnostic précis), je trouve que lancer une exception n'est PAS une bonne pratique.
En C++ Je voudrais écrire une telle fonction:
boost::variant<FileHandle,Error> open(std::string const& name, mode_t mode);
La fonction peut soit renvoyer un descripteur de fichier (grande) ou une erreur (oups). Mais comme on s'y attend, mieux y faire face maintenant. En outre, il a le grand avantage d'être explicite, en regardant la signature signifie que vous savez à quoi vous attendre (ne parle pas de spécifications d'exception, c'est une fonctionnalité cassée).
En général, j'ai tendance à considérer ces fonctions comme des fonctions find
. Lorsque vous recherchez quelque chose, on s'attend à ce que la recherche échoue, il n'y a rien d'exceptionnel ici.
Pensez le cas général d'un conteneur associatif:
template <typename Key, typename Value>
boost::optional<Value const&> Associative::GetItem(Key const& key) const;
Encore une fois, grâce à Boost, je précise que ma méthode peut (ou non) retourner la valeur attendue. Il n'est pas nécessaire d'émettre une exception ElementNotFound
.
Encore un autre exemple: la validation de l'entrée de l'utilisateur devrait échouer. En général, les intrants devraient être hostiles/mal formés/mauvais. Pas besoin d'exceptions ici. D'autre part, supposons que mon logiciel traite une base de données et ne puisse pas fonctionner sans lui. Si la couche d'abstraction de la base de données perd la connexion à la base de données et ne peut pas en établir une nouvelle, il est logique de déclencher une exception.
Je réserve des exceptions pour des problèmes techniques (perte de connexion, mémoire insuffisante, etc ...).
Il y a quelque temps, nous avons parlé sur les exceptions: http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively –
Attraper exceptions est seulement une partie de l'écriture bonne et robuste code C++. Pensez-vous que vous et vos collègues avez une bonne compréhension de l'écriture de code de sécurité exceptionnelle, ou avez-vous besoin de références à cela aussi? –
Été absent pendant un moment, désolé pour le retard.Je pense avoir une compréhension raisonnable de l'écriture de code de sécurité, mais pas tellement avec mes collègues, donc des références pour cela seraient également appréciées. – BitShifter