2013-06-19 3 views
0

J'ai appris que lorsque je spécifie le type d'exception que la fonction peut lancer aucun autre peut être levé, mais quand j'ai testé ce code, il n'a pas suivi cette règle.Aucune limite sur les types d'exception de lancement

void foo(int i)throw(int) 
{ 
    if(i==2) 
    { 
     throw("exception"); 
    } 
} 
int main() 
{ 
    int i=2; 
    try 
    { 
     foo(i); 
    } 
    catch(const char* ex) 
    { 
     cout<<ex<<endl; 
    } 
    return 0; 
} 

Ai-je mal compris quelque chose?

+1

Les spécifications d'exception n'ont jamais été implémentées correctement par la plupart des compilateurs et C++ 11 les déprécie (pas entièrement mais au moins votre cas d'utilisation). –

Répondre

2

Les spécifications d'exception ne fonctionnent pas comme vous le pensiez.

Vous pouvez toujours lancer une exception, mais si vous autorisez réellement quelque chose de non listé à s'échapper, vous recevrez un appel à unexpected() et terminate().

C'est une erreur commune de penser que la spécification d'exception est similaire à Java, elle ne l'est pas. La plupart des directives indiquent de ne pas les utiliser, peut-être au-delà de throw(). Certains compilateurs sont spécifié pour ne pas les implémenter (vérifiez la dox MSVC si vous utilisez celui-là). Ils sont déconseillés dans la norme actuelle (C++ 11). __noexcept (true/false) avance le cas d'utilisation sensé.

+0

Eh bien pourquoi et comment dois-je utiliser les spécifications d'exception? quel est l'usage d'eux? – petric

+1

simplement vous ne devriez pas. Lisez-les: http://www.gotw.ca/publications/mill22.htm http://www.gotw.ca/gotw/082.htm http://boostjp.github.io/more/lib_guide.htm#Exception -spécification –

+0

Thx mate thats vraiment utile. – petric

Questions connexes