2017-06-18 1 views
-1

J'ai une affectation qui permet de créer une classe Tokenizer C++ avec une méthode publique vector * GetTokens (void); La fonction prend une chaîne dans via stdin, tokenizes la chaîne, et renvoie un pointeur vectoriel des jetons de taille() = 1 ou 2. La fonction doit lancer des erreurs quand: il y a 0 jetons, plus de 2 jetons, lorsque le premier jeton n'est pas une chaîne, ou lorsque le premier jeton n'est pas une chaîne et le second n'est pas un entier.Erreur de la fonction de membre de la classe C++/gestion des exceptions pendant l'exécution

Code that calls my function from professor: 
////////////////////// 
For (int i=0; i <5; i++) { 
    Tokenizer tok; 
    Vector<string> *test = tok.GetTokens(); 

    If (test->size()==1) { 
    cout << "Yay" << endl; 
    } else { 
    cout << "Boo" << endl; 
    } 
/////////////// 

J'ai réussi à terminer ce programme pour une bonne segmentation. Je dois également imprimer les erreurs via if ... then statements. Cependant, pendant mes erreurs, le cout < < "Yay" ou "Boo" imprime toujours. Je n'ai pas besoin de faire imprimer ce texte tout en permettant à la fonction boucle/appel de continuer à s'exécuter. Existe-t-il un moyen, pour utiliser des exceptions ou des erreurs avec des assertions dans ma méthode GetTokens() pour arrêter l'exécution, imprimer mon texte d'erreur, renvoyer le contrôle à la fonction d'appel sans imprimer de texte supplémentaire et passer au suivant cycle de boucle? :::: EDIT ::::

My Tokenizer.cpp 
/////////////////// 


'//Constructor 
Tokenizer::Tokenizer(void) { } 

//This includes my tokenization with my error/exception handling 
vector<string> * Tokenizer::GetTokens() { 
string strIN; 
cout << "> "; 
getline(cin, strIN); 

vector<string> *tokens = atokenizer(strIN); 

//So with one of my constraints, I need to print an error for 0 tokens 
try{ 
    if(tokens->size()!=0) { 
     return tokens; 
    } else { 
     throw tokens; 
    } 
} 
catch(vector<string> *error) { 
    cout << "ERROR!" << endl; 
    return error; 
} 
} 

//This is my tokenization function which parses by whitespace 
vector<string> *Tokenizer::atokenizer(string strIN) { 
vector<string> *tokens = new vector<string>(); 

string token=""; 
int c=0; 
bool whiteSpace=true; 

//Iterates thru all chars and tokenizes by " " 
for(int i=0; i<strIN.size(); i++) { 
    //Checks if char==1-0,a-z,etc. or is space=" " 
    if((strIN[i]>=33) && (strIN[i]<=126)) { 
     //If char, appends to token 
     token+=strIN[i]; 
     whiteSpace=false; 
    } 
    else if((strIN[i]==32) && (whiteSpace==false)) { 
     //If space, adds token to tokens 
     tokens->push_back(token); 
     token=""; 
     c++; 
     whiteSpace=true; 
    } 
} 

//Adds final token 
if(token!="") { 
    tokens->push_back(token); 
} 

return tokens; 
}' 
////////////////// 
+0

C'est là que les exceptions entrent en jeu, lisez-les et testez ce qui se passe quand vous lancez quelque chose dans 'GetTokens'. BTW si votre 'GetTokens' n'est pas absolument énorme, alors le coller ici aiderait probablement –

+0

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+0

Il n'y a pas grand intérêt à lancer quelque chose et à l'attraper immédiatement dans la même fonction. Généralement, vous lancez pour sortir de votre contexte de fonction et laissez une fonction d'appel le gérer. – aschepler

Répondre

0

Alors je me suis dit une autre façon de résoudre ma question. Je n'arrivais pas à gérer les erreurs ou les exceptions. Au lieu de cela, je suis juste retourné à l'aide des instructions If ... then ... else pour faire une vérification d'erreur avec cout, puis j'ai créé des fonctions pour contrôler l'impression.

void coutOff() { 
    cout.setstate(std::ios_base::failbit) 
} 

void coutOn() { 
    cout.clear(); 
}