Mi stavo ponendo il problema di come cautelarmi nei confronti di possibili fallimenti del costruttore di un oggetto.

Ho fatto questo codice di prova:

codice:
class Prova
{
 public:
   Prova(std::vector<int> values)
   {
       try
       {
         if(values.size()!=3)
         {
           throw 0;
         }
         else
         {
           a=values[0];
           b=values[1];
           c=values[2];
         }
       }
       catch(...)
       {
        std::cout<<"\nImpossibile costruire prova!";   
       }
   };
   void view()
   {
       std::cout<<"\nvalore di a: "<<a;
       std::cout<<"\nvalore di b: "<<b;
       std::cout<<"\nvalore di c: "<<c;
   };

 private:
   int a;
   int b;
   int c;
};

int main()
{

    Prova prova(std::vector<int> {1,2,3,4,5,6});
    prova.view();


}

ed ottengo il seguente output

Impossibile costruire prova!
valore di a: 0
valore di b: 0
valore di c: 0

nonchè i seguenti warning:


In function 'int main()':
33:39: warning: 'prova.Prova::c' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::c' was declared here
32:39: warning: 'prova.Prova::b' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::b' was declared here
31:39: warning: 'prova.Prova::a' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::a' was declared here

e così non è un buon comportamento...ho dei valori per a,b e c quando invece l'oggetto non dovrebbe essere stato nemmeno creato.

Mi pare piu' 'cautelativo' implementare l'eccezione nel seguente modo:

codice:
class Prova
{
 public:
   Prova(std::vector<int> values)
   {
       
         if(values.size()!=3)
         {
           throw 0;
         }
         else
         {
           a=values[0];
           b=values[1];
           c=values[2];
         }

   };
   void view()
   {
       std::cout<<"\nvalore di a: "<<a;
       std::cout<<"\nvalore di b: "<<b;
       std::cout<<"\nvalore di c: "<<c;
   };

 private:
   int a;
   int b;
   int c;
};

int main()
{

    try
    {
        Prova prova(std::vector<int> {1,2,3,4,5,6});
        prova.view();
    }
    catch(...)
    {
        std::cout<<"\nImpossibile costruire prova!";   
    }


}
Da cui ottengo il seguente output

Impossibile costruire prova!

Consigli, soprattutto legati alla possibilita' di casi futuri piu' complicati?