#c #try-catch
#c #try-catch
Вопрос:
Как мне сделать так, чтобы этот try-catch не выводил ошибку дважды? Код (ниже) должен распознавать только snap, csg, cdh и cr. Он печатает это так:
Input Strings:
snap(12345,Charlie Brown,Manager,555-1234).
snap(67890,Lucy,Right Field,555-5678).
csg(CS101,12345,A).
csg(CS101,67890,B).
csgs(CS101,67890,B). // i want to get rid of this
**Error: csgs(CS101,67890,B). // repeat
cdh(CS101,M,9AM).
cr(CS101,1170 TMCB).
Вот мой код:
out << "Input Strings:" << endl;
for (string line; getline(in, line);) {
out << line;
try {
if ("snap(" == line.substr(0, 5)) {
string studentID = line.substr(5, line.find(',') - 5);
line = line.substr(line.find(',') 1);
string studentName = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentAddress = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentPhone = line.substr(0, line.find(')'));
snaps.emplace_back(studentID, studentName, studentAddress, studentPhone);
continue;
}
else if ("csg(" == line.substr(0, 4)) {
string courseName = line.substr(4, line.find(',') - 4);
line = line.substr(line.find(',') 1);
string studentID = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentGrade = line.substr(0, line.find(')'));
csg.emplace_back(courseName, studentID, studentGrade);
continue;
}
else if ("cdh(" == line.substr(0, 4)) {
string courseName = line.substr(4, line.find(',') - 4);
line = line.substr(line.find(',') 1);
string courseDay = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string courseTime = line.substr(0, line.find(')'));
cdh.emplace_back(courseName, courseDay, courseTime);
continue;
}
else if ("cr(" == line.substr(0, 3)) {
string courseName = line.substr(3, line.find(',') - 3);
line = line.substr(line.find(',') 1);
string courseRoom = line.substr(0, line.find(')'));
cr.emplace_back(courseName, courseRoom);
continue;
}
throw string(line);
}
catch (const runtime_erroramp; error) { out << endl << "**Error: " << error.what(); }
catch (const stringamp; e) { out << endl << "**Error: " << e; }
}
in.close();
Комментарии:
1. Вы должны создавать исключения, а не данные, и здесь вообще нет особой необходимости в исключениях. Просто верните
null
.
Ответ №1:
Очевидно, вам нужно двигаться out << line;
так, чтобы он печатал только тогда, когда вы знаете, что у вас нет ошибки.
Я не вижу необходимости в исключениях в этом коде. Исключения действительно должны быть зарезервированы для исключительных ситуаций, и пропуск неверных данных на самом деле не таков. Также операторы continue обычно считаются плохим стилем, опять же потому, что они прерывают нормальный поток программы, затрудняя ее понимание.
Вот ваш код, переписанный без исключений и без продолжения. Все, что вам действительно нужно сделать, это обработать случай ошибки в предложении else и переместить печать строки в конец цикла.
out << "Input Strings:" << endl;
for (string line; getline(in, line);) {
if ("snap(" == line.substr(0, 5)) {
string studentID = line.substr(5, line.find(',') - 5);
line = line.substr(line.find(',') 1);
string studentName = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentAddress = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentPhone = line.substr(0, line.find(')'));
snaps.emplace_back(studentID, studentName, studentAddress, studentPhone);
}
else if ("csg(" == line.substr(0, 4)) {
string courseName = line.substr(4, line.find(',') - 4);
line = line.substr(line.find(',') 1);
string studentID = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string studentGrade = line.substr(0, line.find(')'));
csg.emplace_back(courseName, studentID, studentGrade);
}
else if ("cdh(" == line.substr(0, 4)) {
string courseName = line.substr(4, line.find(',') - 4);
line = line.substr(line.find(',') 1);
string courseDay = line.substr(0, line.find(','));
line = line.substr(line.find(',') 1);
string courseTime = line.substr(0, line.find(')'));
cdh.emplace_back(courseName, courseDay, courseTime);
}
else if ("cr(" == line.substr(0, 3)) {
string courseName = line.substr(3, line.find(',') - 3);
line = line.substr(line.find(',') 1);
string courseRoom = line.substr(0, line.find(')'));
cr.emplace_back(courseName, courseRoom);
}
else {
out << endl << "**Error: ";
}
out << line << endl;
}
Комментарии:
1. Спасибо. Странно, потому что от нас требовалось использовать try catch и создавать исключения… плюс в его демонстрациях для нас, мой профессор. используется «продолжить». Полезно знать