2009-02-16 12 views
13

Puis-je avoir des blocs try-catch imbriqués? Par exemple:Puis-je avoir des blocs try-catch imbriqués en C++?


void f() 
{ 
    try 
    { 
     //Some code 
     try 
     { 
      //Some code 
     } 
     catch(ExceptionA a) 
     { 
      //Some specific exception handling 
     } 
     //Some code 
    } 
    catch(...) 
    { 
     //Some exception handling 
    } 
}//f 
+3

Vous devez aimer ces gens qui pensent qu'ils sont plus intelligents que tout le monde et pensent qu'ils possèdent ce site Web –

+2

Je donne généralement ce genre de questions au bénéfice du doute: ce n'est pas parce que cela fonctionne sur votre compilateur de la norme. L'inverse est également vrai. – rmeador

+2

@shoosh cette question m'a sauvé au moins 90 secondes de la recherche! –

Répondre

19

Oui parfaitement légal.

Bien qu'il serait préférable de déplacer les intérieurs dans une autre méthode de sorte qu'il semble plus propre et votre méthode (s) sont plus petites

1

Oui, vous pouvez.

7

Comme nous l'avons dit, il est possible, mais vous devez voir le « fall-through '-scheme dans ceci. Si dans le premier try-catch-block votre exception est interceptée, elle ne sera pas interceptée par le catch-block externe. Toutefois, s'il n'est pas intercepté par le catch-block interne, il tentera de trouver un gestionnaire d'exceptions correspondant dans le catch-block externe.

Vous pouvez également déclencher explicitement l'exception au prochain gestionnaire d'exceptions en utilisant throw; dans votre gestionnaire d'exceptions interne.

Par exemple, ce code:

try 
{ 
    try 
    { 
     throw std::runtime_error("Test"); 
    } 
    catch (std::runtime_error& e) 
    { 
     std::cerr << "Inner Exception-Handler: " << e.what() << std::endl; 
     throw; 
    } 
} 
catch (std::exception& e) 
{ 
    std::cerr << "Outer Exception-Handler: " << e.what() << std::endl; 
}

généreront:

Inner Exception-Handler: Test 
Outer Exception-Handler: Test

Cela fonctionne parce que std::runtime_error is derived from std::exception. Vous devriez également noter que dans un tel exemple trivial, il est également possible de simplement écrire les catch-blocks les uns après les autres, mais si vous voulez exécuter un autre code après le premier catch-block, vous devrez les imbriquer.

1

C'est légal mais ce n'est pas du tout utile à moins que vous ne lançiez une exception de votre catch interne(). Par exemple, vous pourriez vouloir attraper une exception au niveau du système, mais jeter votre propre objet d'exception pour la clarté du code.

+3

Il est utile que la capture externe gère un ensemble différent d'exceptions – MSalters

5

Oui, c'est légal. Comme le dit ouster, une façon de le gérer est de placer le bloc try-catch interne dans sa propre fonction et d'appeler cette fonction depuis votre bloc try-catch externe.

Une autre façon de le gérer est de plusieurs blocs catch. La chose à faire attention ici est la spécificité des types d'exception dans vos blocs catch. Si ExceptionB étend ExceptionA dans l'exemple ci-dessus, le bloc ExceptionB ne sera jamais appelé car toute exception B qui sera levée sera gérée par le bloc ExceptionA. Vous devez ordonner les blocs catch dans l'ordre le plus spécifique au moins spécifique lorsque vous traitez avec des hiérarchies de classes Exception.

Questions connexes