c++从文件中读取:使用.fail()或try/catch的if条件

C++ reading from a file: if condition with .fail() or try/catch

本文关键字:try catch 条件 if 文件 读取 fail 使用 c++      更新时间:2023-10-16

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

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

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

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

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

如果问题不能在检测到的位置完全处理,则应该抛出异常。

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

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

关注可以解决问题的地方。如果你想让调用代码决定如何处理这个问题,throw .

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

这完全取决于什么"客户端"将使用此方法。谁将调用这段代码,他们将用它来做什么。

如果不抛出异常对它们更好,则使用您的返回格式。至于信息和数量,这又取决于人们如何使用它。

与其他返回方式相比,我通常更喜欢抛出异常,因为我可以自定义异常并向异常添加细节,以便调用者确切地知道发生了什么(因此他们可以找出如何在代码中修复它)。