【问题标题】:C++ reading from a file: if condition with .fail() or try/catchC++ 从文件中读取:if 条件为 .fail() 或 try/catch
【发布时间】:2013-03-07 07:07:20
【问题描述】:

我有一个从文件读取的 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. 如果上面的实现是正确的,对于测试:我是否应该让方法返回一个字符串(“无法打开输入文件”),并在测试中断言这个字符串是否返回?

【问题讨论】:

  • 这实际上与从文件中读取无关。

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


【解决方案1】:

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

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

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

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

ASSERT 在生产代码中无效。你不应该让你的程序的行为依赖于ASSERT

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 关于我的第一个问题,C++ iostreams 是否默认不抛出异常,因此 try/catch 在这种情况下没有用处?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多