Question

Nous considérons qu'une exception dans l'initialisation peut arriver.Nous écrivons donc Essayer / Catch Block.

int f(){
    throw 1;
}

class A
{
public:
    A() try : _k(f())
    {}
    catch (int)
    {
        std::cout << "Exception 1" << std::endl;
    }

private:
    int _k;
};

Mais la prorogation des rethrows à un niveau plus profond.Thats signifie que le code suivant

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}

sortira:

Exception 1
Exception 2

pourquoi ce bloc d'essai / capture se comporte de la même manière que le bloc d'essai / attraper ordinaire?

Exemple de code complet: http://ideone.com/xjy2d

Était-ce utile?

La solution

Il semble que votre question est la suivante: pourquoi un niveau de fonction essaie-t-il / attrape-t-il automatiquement l'échassement?En lançant une exception d'une construction d'un objet, cet objet est considéré comme mort avant la vie.Tous ses sous-observations sont détruits.C'est-à-dire que si une exception est lancée pendant la construction, il n'y a pas d'objet.Si l'exception ne jetterait pas, vous obtiendrez une coque d'un objet dans vos mains.Ceci n'est clairement pas souhaitable.

Autres conseils

L'objet que vous construisez n'a pas vraiment été construit, le retour simple n'est pas une option.Ce genre de prises de try0 est toujours retiré (sauf si vous vous lancez votre propre exception de la clause de capture).

Parce que ce n'est pas un bloc d'essai ordinaire, mais un niveau de la fonction essayer / attraper.Il retire automatiquement à moins que vous ne le faisiez explicitement en utilisant throw.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top