主要的C ++异常

时间:2011-09-30 16:06:12

标签: c++ exception

我的类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中捕获异常是错误的吗?

4 个答案:

答案 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中捕获异常是错误的吗?

不,不是。简单明了。