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();
}
}
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
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. –