0
votes

C ++ - Exception dans le constructeur

J'ai un problème. Je dois jeter une exception dans le constructeur un () mais je ne sais pas comment puis-je supposer de l'attraper. Quelqu'un peut-il suggérer quelque chose? J'ai essayé cette méthode: Lancer des exceptions à partir de constructeurs ,

My Code: xxx


7 commentaires

Vous devriez mettre un j; dans le bloc TRY-CATCH pour attraper une exception .


L'opération qui jette l'exception doit aller à l'intérieur du bloc . C'est vous dire au compilateur ", je vais essayer quelque chose. Voici une liste de mauvaises choses qui pourraient arriver (diverses captures). S'ils se produisent, faire X, Y, Z ..."


@Nutcracker - Quoi? Vous n'avez pas d'autre moyen d'indiquer une défaillance de la construction. La mauvaise idée est de lancer dans un destructeur .


@Nutcracker pourquoi mauvaise idée? Si la construction échoue, je ne savais pas comment signaler que sinon une exception.


Oui, j'avais tort. Je pensais destructeurs


@ Storyteller-erlandermonica Il y a d'autres façons, mais tout ce qui me vient à mon esprit est vraiment de mauvaises idées;) (comme à l'aide d'un isproperlyconstructé drapeau)


@ IDCLEV463035818 - Ce n'est pas un moyen, c'est une belette autour d'un mensonge. La construction a couru à l'achèvement, l'objet est effectué. S'il ne peut pas être créé dans un état valide, cela ne devrait pas exister.


3 Réponses :


6
votes

Placez la définition de la variable à l'intérieur du Essayez Bloc: XXX


0 commentaires

2
votes

Tout d'abord, ne jetez pas la non exception. 2. Si vous appelez Constructeur à l'intérieur du bloc d'essai, vous pouvez l'attraper alors.

#include <iostream>
#include <stdexcept>

class One
{
    int a, b;
public:
    One():
     a(7),
     b(0) 
   {
        if (b == 0) {
            throw std::runtime_error("except");
        }       
   }

};

...

try { 
   One j; 
   std::cout << "good" << std::endl; 
} catch(std::exception& e) { 
   std::cerr << e.what() << std::endl; 
} 


0 commentaires

0
votes

Une autre solution si vous ne voulez pas avoir le code entier à l'intérieur d'un bloc de try..catch: xxx pré>

et bien sûr, vous devez un pointeur intelligent dans ce cas: P >

int main()
{
  std::unique_ptr< One> j;
  try 
  {
      j.reset( new One());   // or use std::make_unique<>()
      cout << "good"; 
  } catch (const char *str)
  {
      cout << str;
      return 0;
  }
  // continue with object in j ...
}


0 commentaires