【问题标题】:Throwing an error to main from a function called by another function从另一个函数调用的函数向 main 抛出错误
【发布时间】:2014-02-01 18:15:29
【问题描述】:

假设我有一个函数 (mnHw) 可以计算向量(作业成绩向量)的平均值。当向量为空时,此函数会引发domain_error("Student did no homework") 异常。当我从main 调用mnHw 时,当我想打印出错误时,事情就很简单了:

        try
        {
            cout  <<  mnHw(student.homework);
        }
        catch (domain_error e)
        {
            cout << e.what();
        }

但是,如果我只想存储学生的平均作业成绩,而不是所有成绩的向量,事情就会变得复杂。在这种情况下,我在读取学生信息(readStudent)的函数中调用mnHw,并在没有输入作业时设置一个标志(-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 显示它的情况(这里就是这种情况)。是否有一些我遗漏的技巧或技术可以直接让mainmnHw 访问e.what()

什么是好的做法?

请注意,我可以发布每个案例的完整功能,但它们似乎太长了。请让我知道我是否应该将它们包括在内以使自己更清楚。另外,请随时纠正我犯的任何其他错误。我现在正在以正确的方式学习C++,并希望尽可能地纠正。 &lt;flame-retardant vest&gt;

【问题讨论】:

  • “这个标志方法似乎不如将实际错误消息直接传递给 main 优雅” - 不完全是。就个人而言,我讨厌应该进行计算的函数,但它们正在打印到 stdout/stderr。它伤害了我的平衡感。 :P 如果一个函数正在执行计算,那么让它执行它的任务,然后返回一个有效值或一个超出范围的值以发出错误信号。然后它的用户/客户端/调用者(把你的代码想象成一个库!)在遇到错误时可以做任何事情。
  • 为什么不让你的函数抛出异常并在main 上捕获?
  • @wesley.mesquita:这就是第一个版本所做的(我原始帖子中的第一块代码来自 main)。但问题是,当异常抛出函数被另一个函数调用时,我该如何在 main 中执行此操作?请注意,这是我对 Accelerated C++ 问题 4.6 自学的一部分。我认为这个问题的重点是弄清楚这个谜题。我的“解决方案”是使用标志,但我不禁认为应该有更好的方法。

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


【解决方案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。当然,创建一个新的异常类型还需要做更多的工作,但它可以获取更多信息并让函数只按照他们应该做的事情来做。

【讨论】:

  • 谢谢,我会试试这个。有什么好的资源推荐可以快速解释如何创建一个新的异常类型?
  • @neuronet 看看here。我曾经从 std::exception 继承,但似乎从 std::runtime_errorstd::logic_error 继承它是更好的做法。
  • 我想知道是否有适合新手的示例……对于入门书第 4 章的人来说,这很深奥?也许我现在应该减少损失,并在我完成课程后从头到脚用一个完整注释的例子来回答这个问题......虽然这个链接看起来很有帮助:stackoverflow.com/questions/16182781/creating-exceptions-c
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 2010-12-19
  • 2022-01-23
  • 1970-01-01
  • 2019-10-14
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多