c++从文件中读取:使用.fail()或try/catch的if条件
C++ reading from a file: if condition with .fail() or 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)绝对不会。您可以让它返回一个值,例如成功/失败的true/false,但您永远不希望它是这样的字符串。当预期文件可能不存在,并且高层代码可能会处理它或不关心它时,您可能希望返回一个错误代码。(异常是昂贵的,所以对于常见的情况你不应该抛出它们)。
上面的实现是检查错误的正确方法,还是应该抛出异常?你有选择其中任何一个的理由吗?
如果在检测到错误时可以完全处理,则该实现是正确的。(你似乎在决定程序应该退出)
如果问题不能在检测到的位置完全处理,则应该抛出异常。
如果上面的实现是正确的,对于测试:我应该让方法返回一个字符串("无法打开输入文件"),并断言该字符串是否在测试中返回?
ASSERT
在生产代码中没有影响。你不应该让你的程序的行为依赖于ASSERT
。
关注可以解决问题的地方。如果你想让调用代码决定如何处理这个问题,throw
.
在没有catch
/throw
的C语言中,返回一个错误代码是典型的。但是这种做法惩罚了程序员编写小而简洁的函数,因为错误可能必须通过许多堆栈级别返回。
这完全取决于什么"客户端"将使用此方法。谁将调用这段代码,他们将用它来做什么。
如果不抛出异常对它们更好,则使用您的返回格式。至于信息和数量,这又取决于人们如何使用它。
与其他返回方式相比,我通常更喜欢抛出异常,因为我可以自定义异常并向异常添加细节,以便调用者确切地知道发生了什么(因此他们可以找出如何在代码中修复它)。
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 我可以使用 try catch 语句来捕获任何错误而不是具体错误吗?
- 在大型应用程序的main上使用try-catch
- RapidXML 节点在 try catch 块中具有正确的值,但它在块外为 nullptr
- 提取 try-catch 时出现运行时错误
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 何时删除 try-catch 块中的指针
- 是否有理由大多数/所有 try-catch 示例只对 throw 语句使用 void 子函数
- 循环try..catch ..确保输入有效或使用控制语句
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- C++ C2509 在讲师的定义中使用 try: - catch
- 为什么未达到的 try-catch 块会增加运行时时间
- 在 C++ 中使用 try-catch 进行删除 [] 或删除操作是否必要
- ex.nested try-catch中的什么()更改
- 为什么 c++ try-catch 块不能在 ubuntu 上与 g++ 一起使用?
- 格式化文件异常被 try catch 块忽略
- libpng错误不会被try/catch块捕获
- 在 C++ 和 C# 中使用 try/catch 的正确方法是什么?
- c++中try-catch块的catch中使用了哪些参数