从另一个函数调用的函数向main抛出一个错误

时间:2014-02-01 18:15:29

标签: c++ exception-handling try-catch

让我们说我有一个函数(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}}

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。当然,创建一个新的异常类型还有一些工作要做,但是它可以获得更多的信息,并让函数只能按照他们所说的去做。