我的类Person有不同的文件作为属性。
class Person {
private:
fstream history;
fstream familyTree;
public:
Person() {
history.open("history.dat");
familyTree.open("tree.dat");
}
}
如果无法打开任何文件,我需要我的程序返回不同的值。
如果历史未打开,则返回1,如果familyTree未打开,则返回2.
1)使用例外是唯一的解决方案吗?
2)例外情况在哪里发布?
3)如果我在main中捕获异常是错误的吗?
答案 0 :(得分:2)
您可以在构造函数中抛出异常并在main中捕获它们。或者您可以在构造函数中捕获异常并修复它,以便无论发生什么情况都可以正确初始化类。
为了使您的类更易于测试,构造函数应该尽可能少地工作。我有两种方法:
bool readHistory (std::string fileName)
bool readFamillyTree (std::string fileName)
而不是尝试在构造函数中执行此操作。如果文件可以读取并且理智,它们将返回true。你可以有一个重载的构造函数来调用这些方法。正如注释中所指出的,构造函数应该返回一个可用的对象。我假设这些文件不是对象运行所必需的。这可能是错误的。
答案 1 :(得分:1)
此处不需要例外。
bool Person::IsHistoryValid() const
{
return history;
}
bool Person::IsFamilyTreeValid() const
{
return familyTree;
}
int main()
{
Person person;
if (!person.IsHistoryValid())
return 1;
if (!person.IsFamilyTreeValid())
return 2;
// do some work
return 0;
}
根据您的要求,在main
中捕获例外可能是对或错。当然,如果你必须在异常的情况下返回错误代码,那么你必须抓住它们。
答案 2 :(得分:1)
1)使用例外是唯一的解决方案吗?
没有。您还可以在构造函数中记录错误状态,并有一个返回它的方法。或者你可以进行两阶段构造,其中构造函数只执行不会失败的部分,并调用第二个初始化函数来完成它。
我认为例外是首选方法。如果你正在做的事情可能需要一些清理,如果构造函数失败,在局部变量上执行它们并将结果复制到最后的成员变量。
如果main()是 最近的堆栈调用(写得好吗?)到例外的地方 推出,
2)如果我在main中捕获异常是错误的吗?
在main中捕获异常绝对没有错。实际上,最好的做法是在最外层捕获可以对错误做任何事情的异常;通常这意味着显示错误并关闭程序,主要是完美的地方。
答案 3 :(得分:1)
1)使用例外是唯一的解决方案吗?
当然不是,有许多设计早于使用返回码,双初始化和此类技术的异常功能。也就是说,如果Person
的构造需要打开两个文件,而你不能这样做,那么抛出异常是报告它的首选方式。想想你的设计对于Person
意味着什么,并创建一个默认的构造。
2)如果我在main中捕获异常是错误的吗?
不,不是。简单明了。