Question

En Java si un argument d'entrée à une méthode est invalide, nous pouvons jeter un IllegalArgumentException (qui est de type RuntimeException). En C ++, il n'y a aucune notion d'exceptions non contrôlées et vérifiées. Y at-il une exception similaire dans la norme C ++ qui peut être utilisé pour indiquer une exception d'exécution? Ou est-il un style commun pas dans la norme, mais tout le monde suit dans la pratique d'une telle situation?

Ou, devrais-je simplement créer ma propre exception personnalisée et de le jeter?

Était-ce utile?

La solution

Contrairement à Java, C ++ ne dispose pas d'un « cadre standard », mais seulement un petit (et en option) bibliothèque standard. De plus, il y a des opinions différentes sous les programmeurs C d'utiliser ou non des exceptions tout .

Par conséquent, vous trouverez différentes recommandations par différentes personnes: Certains aiment utiliser des types d'exception de la bibliothèque standard, certaines bibliothèques (par exemple Poco) utilisent une hiérarchie d'exception personnalisée (dérivée de std :: exception), et d'autres ne pas utiliser exceptions à tous (par exemple Qt).

Si vous voulez coller à la bibliothèque standard, il existe un type d'exception spécialisée:. invalid_argument (étend logic_error)

#include <stdexcept>

// ...
throw std::invalid_argument("...");

Pour la référence: Voici un aperçu des types d'exception standard définies (et documentées) dans stdexcept:

exception
    logic_error
        domain_error
        invalid_argument
        length_error
        out_of_range
    runtime_error
        range_error
        overflow_error
        underflow_error

Autres conseils

std :: domain_error peut être ce que vous cherchez, mais je pense que très peu de gens l'utilisent. La plupart des gens tirent leurs propres types d'exception de std :: exception.

J'utilise toujours std::invalid_argument pour les arguments illégaux.

Si par vous dire incorrectes ne méthode satisfait les valeurs attendues, vous pouvez jeter

std::logic_error 
or 
std::runtime_error.

Si vous voulez dire quelque chose lié à un objet comme moulages ne peut pas être converti en un autre - il ne fait pas exception pour cela et il ne sera pas jeté automatiquement.

En fait, il le fera. Mais seulement pour dynamic_cast <> sur des références. Il lancera

std::bad_cast

Je ne suis pas sûr que ce soit une bonne idée de jeter celui-ci par vous-même.

Je préfère utiliser logic_error et ses dérivés dans le cas où quelqu'un paramètre transmis erroné parce qu'il est une erreur logique: programmeur passé un mauvais type d'argument.

Mais plus de tout ce que je préfère utiliser assert dans de tels cas. Parce que ces choses comme le passage des valeurs erronées ou types à votre fonction peut être acceptable au cours du développement et ces contrôles doivent être évités dans la libération.

Vous pouvez lancer une exception standard ou rouler votre propre. Vous voudrez peut-être inclure des informations supplémentaires à l'exception que vous jetez, et ce serait une bonne raison de le faire vous-même.

Personnellement, je ne l'ai pas vu un tel contrôle de domaine dans les systèmes que j'ai travaillé. Il est certainement pas universel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top