让我们说我有一个函数(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,至少对于那些我想从main显示它的情况(这是这里的情况)。是否有一些我不知道的技巧或技巧会直接从main
e.what()
mnHw
<flame-retardant vest>
访问{{1}}?
什么是好习惯?
注意我可以发布每个案例的完整功能,但它们似乎太长了。如果我应该把它们包括在内以便让自己更清楚,请告诉我。此外,请随时纠正我正在做的任何其他错误。我现在正在以正确的方式学习C ++,并希望尽可能地得到纠正。 {{1}}
答案 0 :(得分:1)
您可以重新抛出捕获的(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
。当然,创建一个新的异常类型还有一些工作要做,但是它可以获得更多的信息,并让函数只能按照他们所说的去做。