2013-03-18 15 views
1

我在C++中有一个从文件读取的函数。这些函数以一个表示文件名称的字符串作为参数。该函数有一个if条件来检查错误(如文件不存在)。从文件中读取C++:如果条件使用.fail()或try/catch

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. 如果上述实现是正确的,对于测试:我应该让该方法返回一个字符串(“无法打开输入文件”),并且ASSERT表示该字符串被返回或者不在测试中?
+0

这实际上与阅读文件无关。 – 2013-03-18 19:46:30

回答

2

1)你想让应用程序做什么?失败是否可以在更高的水平上恢复?如果是,抛出异常。如果不是这样,并且这个代码在相当早的时候出现,只要退出并出现错误就可以,但是您应该添加失败的文件名到日志消息。 2)绝对不是。你可以让它返回一个值,例如成功/失败的真/假,但你永远不希望它是这样的字符串。如果预期文件可能不存在,并且可能是较高级别的代码将处理该文件或不在意,您可能希望返回错误代码。 (例外是昂贵的,所以对于常见的情况你不应该扔掉它们)。

+0

关于我的第一个问题,C++ iostreams在默认情况下不会抛出异常,因此try/catch在这种情况下不会有用吗? – FranXh 2013-03-18 20:04:57

1

这一切都取决于什么“客户”将使用此方法。谁将调用此代码,以及他们将如何使用它。

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

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

2

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

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

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

如果上述实现是正确的,对于测试:我应该让该方法返回一个字符串(“无法打开输入文件”),并且ASSERT表示该字符串返回或不在测试中?

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

专注于问题可以解决的地方。如果你想要调用代码来决定如何处理这个问题,throw

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