2017-09-27 3 views
0

Dans mon code, je souhaite lancer un message, de sorte qu'il apparaît à l'écran lorsqu'une entrée est détectée. Je voulais faire comme ça, mais ça n'a pas marché. Donc, je voudrais votre aide pour voir s'il y a quelque chose que je ne sais pas, ou si c'est une action illégale en C++.Lancer un const. * Dans un bloc Try-Catch

C'est là dans mon code le lancer apparaît (une classe mise en œuvre fonction membre)

//set the value of _s (seconds) 
void Time::setSeconds(int s){ 
    if (s > 60 || s < 0) 
     throw ("The value inside seconds has to be valid"); 
    else 
     _s = s; 
} 

Et voilà comment je parviens à faire un simple bloc-catch try

try{ 
    Time t(12,4,-12); 

    t.printStandard(); 

    }catch(string const &a){ 
     cerr << a; 
    } 

Cependant , lorsque le programme est exécuté, j'obtiens le message d'erreur suivant:

terminate called after throwing an instance of 'char const*' 
Aborted (core dumped) 

Qui n'est évidemment pas e destiné.

+1

Si vous jetez un 'const char *' ce que vous attrapez un 'std :: string'? – NathanOliver

+1

Les conversions ne sont pas prises en compte pour la capture d'exception. –

+0

La revendication "Utilisation de std :: invalid_argument (" text ... ") fonctionne correctement" semble concerner le code non représenté ici. –

Répondre

0

Vous jetez un pointeur char* mais en essayant d'attraper un std::string objet à la place. L'exception lancée n'est donc pas interceptée. Une exception non interceptée provoque l'appel de terminate(), entraînant la mort du processus.

Donc, vous devez soit:

  • jeter un std::string pour commencer:

    void Time::setSeconds(int s){ 
        if (s > 60 || s < 0) 
         throw std::string("The value inside seconds has to be valid"); 
        _s = s; 
    } 
    

ou

  • attraper un pointeur const char*:

    catch(const char *a) 
    

Cela étant dit, une meilleure approche est de jeter un lieu standard STL exception class, comme std::out_of_range, par exemple:

#include <stdexcept> 

//set the value of _s (seconds) 
void Time::setSeconds(int s){ 
    if (s > 60 || s < 0) 
     throw std::out_of_range("The value inside seconds has to be valid"); 
    _s = s; 
} 

... 

try { 
    Time t(12,4,-12); 
    t.printStandard(); 
} 
catch(std::exception const &a) { 
    cerr << a.what(); 
} 
0

Les gens dans le commentaire m'a aidé pour cette réponse:

Lorsque vous utilisez un jet avec un texte, le compilateur voit que comme const char*. Dans le code, la capture attendait un string const&. L'erreur se produit parce que, comme dit de Cheers et hth. - Alf

conversions ne sont pas pris en considération pour exception la capture

0

Votre prise déclaration doit préciser const char*:

catch(const char* a) 
{ 
. . . 
}