Comment l'essai / attraper dans la liste d'initialisation fonctionne-t-il?
-
12-12-2019 - |
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
Exemple de code complet: http://ideone.com/xjy2d
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
.