Supposons que nous implémentons une collection personnalisée qui se comporte comme un vecteur et que nous souhaitons que operator[]
lève une exception si la collection est vide. std::vector
a un comportement indéfini dans ce cas, mais nous voulons jeter une exception. Si c'était C#, nous lancerions probablement InvalidOperationException
. Mais quel C++ exception serait le plus approprié/intuitif dans ce cas? Je pense que std::out_of_range
ne serait pas le meilleur choix car la collection est vide, donc il n'y a pas de 'range' pour laquelle l'indexation retournerait un élément valide (any).Quelle exception à lancer lorsque l'état actuel de l'objet n'autorise pas l'opération?
Répondre
std::vector::at le fait déjà. Vous pouvez donc utiliser la méthode at
au lieu de operator []
. Il lance std::out_of_range
pour un index non valide.
Veuillez noter que vous devrez faire un travail important pour atteindre les performances de std::vector
. Mais encore si vous voulez coller à votre propre conteneur et que vous voulez lancer de []
alors comme at
la méthode std::out_of_range
est le meilleur choix parmi les classes d'exception standard. Sinon, vous devez définir votre propre classe d'exceptions personnalisées.
Merci @taskinoor. J'ai implémenté cette collection personnalisée juste comme un exercice ... donc c'était plus une question hypothétique. J'éviterais certainement de le faire dans le cas d'un logiciel commercial/de production à moins qu'il y ait une très bonne raison de le faire. –
@BojanKomazec à des fins d'apprentissage, il est parfaitement d'accord, à mon humble avis. Commentaire hors sujet: regardez svp 'std :: allocator' dont vous pourriez avoir besoin pour éviter l'appel inutile de constructeurs par défaut et déplacer la sémantique dont vous pourriez avoir besoin pour une opération de croissance efficace. – taskinoor
En fait, je pense que 'std :: out_of_range' serait en effet l'exception que j'utiliserais. Si le conteneur est vide, tout index est hors de portée, c'est de la même manière que 'std :: vector' se comporte déjà. Rappelez-vous qu'un ensemble vide est toujours un ensemble (dans le sens mathématique) – CoryKramer
IMHO Je pense que tout le monde comprendrait votre utilisation de 'std :: out_of_range'. Même le site de référence auquel vous liez a * Définit un type d'objet à lancer comme exception. Il signale les erreurs résultant d'une tentative d'accès à des éléments hors de portée définie *, ce qui correspond bien à cette situation. – NathanOliver
'vector :: at' lancera' std :: out_of_range' quand le vecteur est vide, donc je crois que c'est vraiment la bonne exception à utiliser. – SirDarius