Equivalent de IllegalArgumentException de Java en C ++

En Java, si un argument d’entrée d’une méthode n’est pas valide, nous pouvons lancer une IllegalArgumentException (de type RuntimeException ). En C ++, il n’existe aucune notion d’exceptions vérifiées et non vérifiées. Existe-t-il une exception similaire en C ++ standard pouvant être utilisée pour indiquer une exception d’exécution? Ou existe-t-il un style commun qui ne figure pas dans la norme mais que tout le monde suit dans la pratique pour une situation comme celle-ci?

Ou devrais-je simplement créer ma propre exception personnalisée et la lancer?

Contrairement à Java, C ++ ne possède pas de “framework standard” mais seulement une petite bibliothèque standard (facultative). De plus, les programmeurs C ++ ont des opinions divergentes sur l’opportunité d’utiliser des exceptions.

Par conséquent, vous trouverez différentes recommandations de différentes personnes: certaines personnes aiment utiliser les types d’exception de la bibliothèque standard, certaines bibliothèques (par exemple, Poco) utilisent une hiérarchie d’exceptions personnalisée (dérivée de std :: exception), d’autres n’utilisent pas du tout les exceptions. (par exemple Qt).

Si vous voulez vous en tenir à la bibliothèque standard, il existe un type d’exception spécialisé: invalid_argument ( logic_error ).

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

Pour la référence: Voici un aperçu des types d’exception standard définis (et documentés) dans stdexcept :

 exception logic_error domain_error invalid_argument length_error out_of_range runtime_error range_error overflow_error underflow_error 

std :: domain_error est peut-être ce que vous recherchez, mais je pense que très peu de personnes l’utilisent. La plupart des gens dérivent leurs propres types d’exceptions à partir de std :: exception.

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

Si non valide vous voulez dire que vous n’êtes pas satisfait des valeurs attendues de la méthode que vous pouvez jeter

 std::logic_error or std::runtime_error. 

Si vous voulez dire quelque chose lié aux transtypes comme si un object ne pouvait pas être converti en un autre – il n’y a pas d’exception pour cela et il ne sera pas lancé automatiquement.

En fait ça va. Mais uniquement pour dynamic_cast <> sur les références. Il jettera

 std::bad_cast 

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

Je préfère utiliser logic_error et ses dérivés au cas où quelqu’un transmettrait un paramètre erroné, car il s’agirait d’une erreur de logique: le programmeur aurait passé un type d’argument incorrect.

Mais plus que tout, j’aime utiliser affirmer dans de tels cas. Parce que des choses telles que le fait de transmettre des valeurs ou des types incorrects à votre fonction ne peuvent être acceptées que pendant le développement et que de telles vérifications doivent être évitées dans la version.

Vous pouvez lancer une exception standard ou lancer la vôtre. Vous voudrez peut-être inclure des informations supplémentaires dans l’exception que vous lancez, et ce serait une bonne raison de faire les vôtres.

Personnellement, je n’ai pas vu ce type de vérification de domaine dans les systèmes sur lesquels j’ai travaillé. Ce n’est certainement pas universel.