1

我在 C++ 中有一个从文件读取的函数。这些函数将一个字符串作为参数,该字符串表示文件的名称。该函数有一个 if 条件来检查错误(例如文件不存在)。

    void B::readFile(string file)
        {
            ifstream stfile;
            stfile.open(file.c_str(), ios::in);

            if ( stfile.fail() ) {
                cerr << "Unable to open input file" << endl;
                exit(-1);
            }

           //---goes on here

         }

我的问题是:

  1. 上述实现是检查错误的正确方法,还是应该抛出异常?你有选择其中任何一个的理由吗?
  2. 如果上面的实现是正确的,为了测试:我应该让方法返回一个字符串(“无法打开输入文件”),并在测试中断言这个字符串是否返回?
4

3 回答 3

2

1)您希望应用程序做什么?故障是否可在更高级别恢复?如果是,则抛出异常。如果不是,并且这是相当早的代码,则只需以错误退出即可,但您可能应该将失败的文件名添加到日志消息中。

2)绝对不是。你可以让它返回一个值,比如成功/失败的真/假,但你永远不希望它是这样的字符串。当预期该文件可能不存在并且可能更高级别的代码将处理它或不关心它时,您希望返回一个错误代码。(异常是昂贵的,所以对于常见的情况你不应该抛出它们)。

于 2013-03-18T19:46:07.103 回答
2

上述实现是检查错误的正确方法,还是应该抛出异常?你有选择其中任何一个的理由吗?

如果在检测到错误时可以完全处理该错误,则该实现是正确的。(您似乎决定程序应该退出)

如果问题无法在检测到的位置完全处理,您应该抛出异常。

如果上面的实现是正确的,为了测试:我应该让方法返回一个字符串(“无法打开输入文件”),并在测试中断言这个字符串是否返回?

ASSERT在生产代码中没有影响。你不应该让你的程序的行为依赖于一个ASSERT.

专注于可以解决问题的地方。如果您希望调用代码决定如何处理此问题,throw.

在没有catch/的 C 中通常返回错误代码throw。但是这种做法会惩罚程序员编写小而简洁的函数,因为错误可能必须通过许多堆栈级别返回。

于 2013-03-18T19:46:16.993 回答
1

这完全取决于什么“客户”将使用这种方法。谁将调用此代码,他们将使用它做什么。

如果他们最好不要抛出异常,请使用您的返回格式。至于信息与数字,这又取决于人们将如何使用它。

我通常更喜欢抛出异常而不是其他返回方式,因为我可以创建自定义异常并向异常添加详细信息,以便调用者确切地知道发生了什么(这样他们就可以弄清楚如何在他们的代码中修复它)。

于 2013-03-18T19:45:04.933 回答