C ++从文件中读取:如果条件为.fail()或try / catch

时间:2013-03-18 19:39:22

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

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

3 个答案:

答案 0 :(得分:2)

1)你想要该应用程序做什么?失败是否可以在更高的水平上恢复?如果是,则抛出异常。如果不是,并且这是早期的代码,只需退出错误即可,但您应该添加失败的文件名。

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

答案 1 :(得分:2)

  

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

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

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

  

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

ASSERT对生产代码没有影响。您不应该使程序的行为取决于ASSERT

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

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

答案 2 :(得分:1)

这完全取决于“客户”将使用此方法。谁将打电话给这个代码,他们将把它用于什么。

如果他们没有抛出异常更好,那么使用你的返回格式。就消息与数字而言,它又取决于人们将如何使用它。

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