2 votes

C++ attraper l'exception du constructeur

Je n'ai pas l'impression de comprendre comment attraper l'exception du constructeur. Voici le code correspondant :

     struct Thread {
            rysq::cuda::Fock fock_;
            template<class iterator>
            Thread(const rysq::cuda::Centers &centers,
                   const iterator (&blocks)[4])
                : fock_()
            {
                if (!fock_) throw;
           }
      };

      Thread *ct;
      try { ct = new Thread(centers_, blocks); }
      catch(...) { return false; } // catch never happens,

L'instruction catch ne s'exécute donc pas et j'obtiens une exception non gérée. Qu'est-ce que j'ai fait de mal ? C'est du C++ pur avec g++.

8voto

James McNellis Points 193607

Vous devez lancer un objet, par exemple,

throw std::exception();

throw sans opérande n'est utilisé qu'à l'intérieur d'un catch pour relancer l'exception gérée par le bloc catch bloc.

3voto

Il faut lancer quelque chose pour attraper quelque chose.

Essayez de modifier la ligne

if (!fock_) throw;

à

if (!fock_) throw "";

et observez la différence.

3voto

Potatoswatter Points 70305

Vous devez lancer quelque chose. throw signifie à lui seul qu'il faut "rejeter" l'exception en cours. S'il n'y a pas d'exception en cours, unexpected est appelé, ce qui entraînera probablement l'abandon de votre programme.

Il est préférable de choisir une classe parmi <stdexcept> qui décrit le problème. logic_error ou un dérivé pour indiquer des erreurs de programmation, ou runtime_error pour indiquer des conditions exceptionnelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X