Скажем, у меня есть функция (mnHw
), которая вычисляет среднее значение вектора (вектор домашней работы). Эта функция вызывает domain_error("Student did no homework")
когда вектор пуст. Когда я вызываю mnHw
из main
, все просто, когда я хочу распечатать ошибку:
try
{
cout << mnHw(student.homework);
}
catch (domain_error e)
{
cout << e.what();
}
Тем не менее, все сложно, если я хочу только сохранить средний класс домашней работы, а не вектор всех классов, для ученика. В этом случае я вызываю mnHw
внутри функции, которая читает в информации о студенте (readStudent
), и выдает флаг (-1), когда домашняя работа не вводится:
try
{
student.finalGrade=mnHw(hwGrades);
}
catch (domain_error e)
{
student.finalGrade = -1;
}
Затем, в main
, я могу сделать следующее, чтобы восстановить ошибку:
if (allStudents[i].finalGrade == -1)
cout << "Student did no homework";
else
cout << allStudents[i].finalGrade;
Интуитивно, однако, этот метод флага кажется менее изящным, чем передача фактического сообщения об ошибке непосредственно в основное, по крайней мере для тех случаев, когда я хочу отображать его из основного (что здесь и происходит). Есть ли какой - то трюк или технику, мне не хватает, что бы сразу дать main
доступ к e.what()
из mnHw
?
Что такое хорошая практика?
Примечание. У меня есть все функции для каждого из этих случаев, которые я мог бы опубликовать, но они казались слишком длинными. Пожалуйста, дайте мне знать, если бы я включил их, чтобы я стал более ясным. Также, пожалуйста, не стесняйтесь исправить любые другие ошибки, которые я делаю. Я только сейчас изучаю C++ правильный путь и хочу, чтобы исправлялось как можно больше. <flame-retardant vest>
Вы можете повторно выбрасывать исключение (const domain_error* e){ throw e;}
. Или лучше, вы можете создать на основе domain_error
создать другое исключение, т.е. student_final_grade_exception
и выбросить его.
РЕДАКТИРОВАТЬ:
Что-то вроде:
try
{
student.finalGrade=mnHw(hwGrades);
}
catch (domain_error& e)
{
student_final_grade_exception mean_excep;
mean_excep.addInfo("Error in calculation means...");
mean_excep.addInfo(e.what());
throw mean_excep;
}
И затем, вы подготовите свой main
чтобы поймать student_final_grade_exception
. Конечно, для создания нового типа исключений существует более небольшая работа, но она позволяет получить дополнительную информацию и позволить функциям только то, что они предполагают делать, как было сказано.
std::exception
, но мне кажется, что он лучше для std::runtime_error
или std::logic_error
.
main
?