c++ - Veiller à ce que les exceptions soient toujours détectées

Translate

Les exceptions en C ++ n'ont pas besoin d'être interceptées (pas d'erreurs de compilation) par la fonction appelante. Il appartient donc au développeur de juger s'il faut les attraper en utilisant try / catch (contrairement à Java).

Existe-t-il un moyen de s'assurer que les exceptions levées sont toujours interceptées en utilisant try / catch par la fonction appelante?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Non.

VoirUn regard pragmatique sur les spécifications d'exceptionpour des raisons pourquoi pas.

La seule façon dont vous pouvez "aider" est de documenter les exceptions que votre fonction peut lancer, par exemple sous forme de commentaire dans le fichier d'en-tête la déclarant. Cela n'est pas appliqué par le compilateur ou quoi que ce soit. Utilisez les révisions de code à cette fin.

La source
Translate

Vous ne devriez pas utiliser d'exception ici. Ce n'est évidemment pas un cas exceptionnel si vous devez vous y attendre partout où vous utilisez cette fonction!

Une meilleure solution serait de faire en sorte que la fonction renvoie une instance de quelque chose comme ça. Dans les versions de débogage (en supposant que les développeurs utilisent les chemins de code qu'ils viennent d'écrire), ils obtiendront une assertion s'ils oublient de vérifier si l'opération a réussi ou non.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}
La source
Translate

En dehors de la portée de votre question, j'ai donc débattu de ne pas publier cela, mais en Java, il existe en fait 2 types d'exceptions, cochées et non cochées. La différence fondamentale est que, tout comme dansc[++], vous n'avez pas à intercepter une exception non vérifiée.

Pour une bonne référenceessaye ça

La source
Translate

Chris'a probablement la meilleure réponse pure à la question:

Cependant, je suis curieux de connaître la racine de la question. Si l'utilisateur doittoujoursenvelopper l'appel dans un bloc try / catch, la fonction appelée par l'utilisateur devrait-elle vraiment lancer des exceptions en premier lieu?

C'est une question difficile à répondre sans plus de contexte concernant la base de code en question. Tirant de la hanche, je pense que la meilleure réponse ici est d'envelopper la fonction de telle sorte que l'interface publique recommandée (sinon seulement, en fonction du style d'exception général du code) fasse le try / catchpourl'utilisateur. Si vous essayez simplement de vous assurer qu'il n'y a pas d'exceptions non gérées dans votre code, les tests unitaires et la révision du code sont probablement la meilleure solution.

La source
Translate

Existe-t-il un moyen de s'assurer que les exceptions levées sont toujours interceptées en utilisant try / catch par la fonction appelante?

Je trouve plutôt drôle que la foule de Java -moi y compris- essaie d'éviter les exceptions vérifiées. Ils essaient de contourner le fait d'être forcés d'attraper des exceptions en utilisantExceptions d'exécution.

La source
Translate

Il y a eu une fois une tentative d'ajoutspécifications d'exception dynamiquesà la signature d'une fonction, mais comme la langue ne pouvait pas imposer leur exactitude, elles ont ensuite été dépréciées.

En C ++ 11 et versions ultérieures, nous avons maintenant lenoexcept spécificateur.
Encore une fois, si la signature est marquée à lancer, il n'est toujours pas nécessaire qu'elle soit traitée par l'appelant.


En fonction du contexte, vous pouvez vous assurer que les comportements exceptionnels seront traités en les codant dans le système de types.

Voir: std :: facultatifdans le cadre des principes fondamentaux de la bibliothèque.

La source
Translate

Ou vous pouvez commencer à lancer des exceptions critiques. Sûrement, une exception de violation d'accèscapturel'attention de vos utilisateurs.

La source