2017-08-30 1 views
5

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?

+2

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

+0

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

+2

'vector :: at' lancera' std :: out_of_range' quand le vecteur est vide, donc je crois que c'est vraiment la bonne exception à utiliser. – SirDarius

Répondre

4

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.

+1

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. –

+1

@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