2017-02-24 2 views
0

Je voudrais savoir lequel des moyens suivants de lancer une exception définie par l'utilisateur sur out_of_range() erreur serait une meilleure façon de le faire. Pour moi, en tant que quelqu'un d'aussi peu expérimenté, ils sont identiques. Mais je suis curieux de savoir s'il y aurait une différence entre les deux et si oui, quoi.Gestion des exceptions vectorielles C++: Quelle est la meilleure façon de lancer out_of_range() et pourquoi?

std::vector<int> container {1, 2, 3, 4, 5}; 

int function1(int x, int y) { 

    if(x < 0 || y < 0) 
     throw USER_DEFINED_OUT_OF_RANGE(); 

    if(x >= container.size() || y >= container.size()) 
     throw USER_DEFINED_OUT_OF_RANGE(); 

    return container[x] + container[y]; 

} 

int function2(int x, int y) { 

    try { 
     return container[x] + container[y]; 
    } 
    catch(const std::out_of_range& e) { 
     throw USER_DEFINED_OUT_OF_RANGE(); 
    } 

} 

Répondre

2

Le premier fonctionne, et le second ne fonctionne pas. Donc le premier est meilleur.

(container[x] est un comportement non défini si x est hors de portée, il ne jette pas vous pouvez corriger cela en utilisant at(), comme @NeilButterworth suggère..)

Mais vous manque un plus grand point de - vous ne devrait pas faire ça du tout. Il y a une très bonne exception standard pour ce contexte, la convertir en quelque chose d'autre ne va aider personne.

+0

Merci pour votre réponse. La raison pour laquelle je pourrais vouloir avoir des exceptions séparées pour remplacer 'std :: out_of_range' est que, disons que je mets ou que j'obtiens des valeurs de deux conteneurs séparés dans la même fonction, disons' function1() ', et ces deux conteneurs pourraient avoir des significations spéciales dans une application (c'est peut-être une application mathématique et quel conteneur est important), donc je pourrais vouloir lancer CONTAINER_1_OUT_OF_RANGE() 'ou' CONTAINER_2_OUT_OF_RANGE() '. Cela semble-t-il irréalisable ou inutile? – Deniz

+0

Je n'ai pas vu de situations où ce niveau de détail dans le type d'exception était utile (bien que cela ne signifie évidemment pas qu'il n'y en ait pas). Il serait préférable de ne pas avoir accès à des éléments hors de portée; Si vous le faites, c'est un bug, et le message d'exception et stacktrace sont susceptibles d'être plus utiles que le type. Les exceptions devraient être exceptionnelles; les attraper puis prendre des décisions en fonction de leurs détails ne me semble pas être la bonne façon de me faire des choses. –

0

Les vecteurs lancent déjà des exceptions si les index sont hors limites. Utilisation:

container.at(x) + container.at(y) 

ou bien dire dans la documentation que le résultat de l'utilisation des index non valides est indéfini, et ne font pas de contrôle du tout.

+0

Mais que se passe-t-il si je veux lancer USER_DEFINED_OUT_OF_RANGE(); 'à la place? – Deniz

+0

Mais ce n'est pas ce que l'OP a demandé ... – einpoklum