【发布时间】: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 显示它的情况(这里就是这种情况)。是否有一些我遗漏的技巧或技术可以直接让main 从mnHw 访问e.what()?
什么是好的做法?
请注意,我可以发布每个案例的完整功能,但它们似乎太长了。请让我知道我是否应该将它们包括在内以使自己更清楚。另外,请随时纠正我犯的任何其他错误。我现在正在以正确的方式学习C++,并希望尽可能地纠正。 <flame-retardant vest>
【问题讨论】:
-
“这个标志方法似乎不如将实际错误消息直接传递给 main 优雅” - 不完全是。就个人而言,我讨厌应该进行计算的函数,但它们正在打印到 stdout/stderr。它伤害了我的平衡感。 :P 如果一个函数正在执行计算,那么让它执行它的任务,然后返回一个有效值或一个超出范围的值以发出错误信号。然后它的用户/客户端/调用者(把你的代码想象成一个库!)在遇到错误时可以做任何事情。
-
为什么不让你的函数抛出异常并在
main上捕获? -
@wesley.mesquita:这就是第一个版本所做的(我原始帖子中的第一块代码来自 main)。但问题是,当异常抛出函数被另一个函数调用时,我该如何在 main 中执行此操作?请注意,这是我对 Accelerated C++ 问题 4.6 自学的一部分。我认为这个问题的重点是弄清楚这个谜题。我的“解决方案”是使用标志,但我不禁认为应该有更好的方法。
标签: c++ exception-handling try-catch