我有一个任务,用一个公共方法创建一个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;
}'
//////////////////
这是异常发挥作用的地方,阅读它们并测试在'GetTokens'中抛出某些东西时会发生什么。顺便说一句,如果你的'GetTokens'不是绝对巨大的,那么在这里粘贴它可能会帮助 –
欢迎来到Stack Overflow。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –
投掷东西并立即捕捉到相同的功能没有多大意义。通常你抛出你的函数上下文,让一些调用函数来处理它。 – aschepler