2017-06-22 5 views
0

J'ai donc cette fonction dans une classe de modèle:std :: exception out_of_range sortie bizarre

T getValue(int x, int y) const throw(logic_error, out_of_range) { // value getter 
    try { 
     if (x > rows || y > cols || x <= 0 || y <= 0) 
      throw out_of_range("Invalid x or y."); 
     else 
      return data[cols*(x-1)+(y-1)]; 
    } catch (out_of_range& e) { 
     cerr << e.what() << endl; 
    } 
} 

L'exception fonctionne si je tente de lui conférant une de numéro de plage, mais la sortie est toujours:

Invalid x or y. 
1 

J'ai essayé pendant une heure de comprendre d'où vient ce 1, de quoi ai-je manqué dans le monde? Cela a certainement quelque chose à voir avec std :: out_of_range, mais je ne peux pas savoir exactement quoi.

EDIT Il est sur une matrice de modèle:

Matrix<int> a(2, 2, 0); // creates a 2x2 matrix of all zeros 
cout << a.getValue(3, 2) << endl; // prints the value at row 3, col 2, which doesn't actually exists; the output is as shown above 

, il est également intéressant de noter que

int b = a.getValue(3, 2); 

donne le résultat attendu:

Invalid x or y. 
+0

Ajouter 'retour 3,' juste avant l'accolade fermante dans 'getValue' et exécuter le code. Cela devrait indiquer clairement ce qui se passe. –

+0

L'a fait; le nombre dans la sortie est maintenant 3, de sorte que 1 j'obtenais était une sorte de valeur de retour voyous. Pourquoi je reçois ça? Des exceptions ne sont-elles pas censées m'aider à ne pas retourner de valeur si la fonction ne peut pas continuer? – Zelethil

+0

@Zelethil - le code attrape l'exception. L'exécution normale continue après la clause catch. Et, oui, le 1 était une sorte de valeur de retour voyous. L'exécution de la fin d'une fonction supposée renvoyer une valeur produit un comportement indéfini. En pratique, vous finissez par voir quelle valeur se trouve dans le registre où la valeur de retour est attendue. –

Répondre

0

a résolu le problème en ajoutant

exit(-1); 

au bloc catch:

catch (out_of_range &e) { 
    cerr << e.what() << endl; 
    exit(-1); 
}