Skip to content

Relancer une exception dans le bloc catch

Solution:

throw; tout seul dans un bloc catch relance l’exception qui vient d’être interceptée. Ceci est utile si vous devez (par exemple) effectuer une opération de nettoyage en réponse à une exception, tout en lui permettant de se propager vers un endroit où elle peut être gérée plus complètement :

catch(...)
{
   cleanup();
   throw;
}

Mais vous êtes aussi parfaitement libre de faire ceci :

catch(SomeException e)
{
   cleanup();
   throw SomeOtherException();
}

et en fait, il est souvent pratique de faire exactement cela afin de traduire les exceptions levées par le code que vous appelez dans les types que vous documentez que vous lancez.

L’exception renvoyée peut avoir un type différent. Cela se compile et s’exécute correctement sur VS2012 :

#include <iostream>

int main() try
{
    try
    {
        throw 20;
    }
    catch (int e)
    {
        std::cout << "An exception occurred. Exception Nr. " << e << std::endl;
        throw std::string("abc");
    }
}
catch (std::string const & ex)
{
    std::cout << "Rethrow different type (string): " << ex << std::endl;
}

Sortir:

An exception occurred. Exception Nr. 20
Rethrow different type (string): abc

Pas nécessairement. Dès que vous l’attrapez, c’est à vous de décider quoi en faire. Vous pouvez soit lever une exception identique, soit une toute nouvelle exception. Ou ne rien faire du tout.



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.