2017-06-18 20 views
-1

我有一个任务,用一个公共方法创建一个C++ Tokenizer类 vector * GetTokens(void);执行过程中的C++类成员函数错误/异常处理

该函数在via stdin中使用一个字符串,对字符串进行标记,并返回size()= 1或2标记的向量指针。该函数在以下情况下需要抛出错误:有0个标记,超过2个标记,第一个标记不是字符串,或者第一个标记不是字符串,第二个标记不是整数。

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; 
    } 
/////////////// 

我已经能够成功地完成此程序的正确标记。我也通过if ... then语句打印出错误。但是,在我的错误期间,“Yay”或“Boo”仍然会打印出来。我需要而不是让这个文本打印出来,同时仍然允许for循环/调用函数继续执行。

有没有办法,在我的GetTokens()方法中使用断言的异常或错误来实质上停止执行,打印我的错误文本,将控制权传递回调用函数,而不打印出任何其他文本并进入下一个进度循环周期? ::::编辑::::

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

这是异常发挥作用的地方,阅读它们并测试在'GetTokens'中抛出某些东西时会发生什么。顺便说一句,如果你的'GetTokens'不是绝对巨大的,那么在这里粘贴它可能会帮助 –

+0

欢迎来到Stack Overflow。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+0

投掷东西并立即捕捉到相同的功能没有多大意义。通常你抛出你的函数上下文,让一些调用函数来处理它。 – aschepler

回答

0

所以我想用不同的方式来解决我的问题。我无法得到任何错误处理或例外的工作。相反,我只是回到使用If ... then ... else语句与cout进行错误检查,然后创建了控制打印输出的函数。

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

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