2010-05-16 4 views
14

Existe-t-il une référence à propos des exceptions de bibliothèque standard C++? Je veux juste savoir quelles fonctions peuvent jeter une exception ou non.Liste d'exceptions de bibliothèque standard C++?

+0

En relation: http://stackoverflow.com/questions/11938979/what-exception-classes-are-in-the-standard-c-library –

Répondre

19

En fait, la plupart des fonctions de bibliothèque standard ne lancent pas les exceptions elles-mêmes. Ils transmettent simplement l'exception lancée par le code utilisateur invoqué par eux. Par exemple, si vous push_back() un élément à un vecteur, cela peut jeter (en raison d'erreurs d'allocation de mémoire et) si le constructeur de copie de l'objet se lève.

A quelques exceptions notables (sans jeu de mots) où les fonctions de bibliothèque jettent sont:

  • Certaines méthodes jetteront out_of_range si l'index fourni est invalide:
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set(), reset() et flip().
  • Certaines méthodes jetteront std::overflow_error sur débordement d'entier:
    • std::bitset<>::to_ulong() et (C++ 0x) to_ullong().
  • std::allocator<T> passera sur std::bad_alloc lancée par new qu'elle invoque.
  • Les flux peuvent être configurés de sorte que std::ios_base::failure soient levés lorsqu'un bit d'état est défini.
  • grandes allocations de tableaux peuvent jeter std::bad_array_new_length
  • dynamic_cast sur une référence peut jeter un std::bad_cast (techniquement pas partie de la bibliothèque standard)
  • Lancer une exception invalide d'une fonction avec une spécification d'exception va lancer une std::bad_exception
  • Appeler un std::function::operator(...) s'il n'a aucune valeur lancera std::bad_function_call.
  • L'utilisation de typeinfo d'un pointeur null peut générer un std::bad_typeid.
  • L'accès à weak_ptr après que la pointe a été libérée lancera un std::bad_weak_ptr.
  • Une utilisation incorrecte de std::promise/std::future peut provoquer un std::future_error.
  • (C++ 11) Les fonctions de conversion de chaîne std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod et std::stold peuvent jeter à la fois std::invalid_argument et std::out_of_range. Dans la famille regex, les constructeurs et les méthodes d'assignation peuvent lancer std::regex_error.

(je fais cette réponse CW, donc si quelqu'un peut penser plus que tel, s'il vous plaît ne hésitez pas à les ajouter ici.)

En outre, pour la 3ème édition de Le langage C++ de programmation, Bjarne Stroustrup a un appendix about exception safety téléchargeable, qui pourrait être pertinent.

+0

+1 pour le lien. Je viens de commencer à le lire. –

+0

Merci pour votre réponse. Au fait, quelle est la réponse de CW? – Brian

+0

@Brian: C'est "wiki de communauté". D'autres sont libres d'éditer n'importe quelle réponse CW (même quand ils n'ont pas le représentant pour éditer les réponses normalement). – sbi

1

Les seules fonctions garanties (par le compilateur) de ne pas lancer des fonctions qui ont la spécification d'exception throw(), comme ceci:

void ThisFunctionNeverThrows() throw() 
{ 
} 

Sinon, toute autre fonction peut potentiellement lancer une exception, à moins d'être documenté autrement. Vous devez prendre en compte la sécurité des exceptions lors de l'écriture de code en présence d'exceptions. Voir l'article de Bjarne Stroustup sur la sécurité des exceptions et la bibliothèque standard: http://www2.research.att.com/~bs/3rd_safe.pdf À partir de la page 19 du PDF, vous trouverez des informations sur les garanties offertes par les conteneurs standards.

+0

Ceci n'est pas correct car de nombreux conteneurs, par ex. garantie de ne pas lancer 'erase()', mais cette fonction n'est pas 'throw()'. Du point de vue de la langue, ce que vous avez écrit a du sens, mais il y a des garanties autres que celles spécifiquement imposées par le compilateur. – doublep

+0

@doublep: 'erase()' * will * throw si le constructeur de la copie du type d'élément se lance. – kennytm

+0

A partir de la page 21 du PDF que j'ai mentionné (Garanties pour 'vector' et' deque'): "A moins d'être lancé par le constructeur de copie ou l'opérateur d'affectation du type d'élément, aucun' erase() 'ne déclenche une exception." –

Questions connexes