如何处理不正确的输入文件
How to handle improper input files
我正在开始一个项目,我想知道在文件输入处理过程中处理错误的最佳实践。我目前的项目计划包括main
中的一个流程,如下所示:
unique_ptr<Configuration> config(initConfig(argc,argv));
unique_ptr<InterfaceA> a(initA(config));
// Do real work here
Configuration类和所有其他类的初始化数据将包含在其输入文件的头文件中,例如:
#ObjectA-1
ObjectA
告诉我,我有一个文件,打算变成一个对象,满足InterfaceA
, 1
告诉我,该接口的具体实现使用。
我的问题是在错误处理功能,如initConfig
和initA
。在这些函数内部,我将解析它们各自文件的第一行,并解码上述信息。如果,让我们说,在initA
我碰巧得到一个文件,没有适当的头,无论是#ObjectB-3
,或根本没有头。我看到了两种处理错误的方法:
抛出将在main中捕获的异常。这将允许我打印一个错误,然后通过错误标志绕过其他init函数,并进行我需要的任何高级清理。这样做的不好的部分是我的
main
主要是由异常处理组成的,这使得代码更难阅读。从init函数内部打印一个错误,然后调用
exit(EXIT_FAILURE)
并依靠我的操作系统来清理先前分配的内存。这可能会导致更干净的代码和更多的本地错误处理。
如果没有使用exit
函数,我个人更喜欢第二种。
我使用以下规则来执行错误处理:
-
如果可以,调用代码是否应该处理异常事件?如果是,抛出异常。有时候"异常"很难定义,所以不妨把它想象成"这种情况应该发生吗?"我认为在这种情况下,你应该抛出异常,
main
应该处理它们如果是有意义的。标准定义了两组异常。首先是那些继承自
std::logic_error
的。当调用代码破坏了函数的契约时,通常会抛出这些问题。然后是那些从std::runtime_error
继承的错误,它们用于只能在运行时检测到的错误。这听起来和你的一模一样。它只在读取文件时才知道文件有问题。当然,如果你愿意,你也可以抛出你自己的异常类型
-
这是一个被认为是正常的错误,可以被调用代码忽略吗?这可能是错误码的适当使用
-
是代码内部的逻辑错误吗?作为
assert
,这更有意义。您应该使用assert
s来验证您所做的实际上是有意义的。int y = 5; y++; assert(y == 6);
就是一个愚蠢的例子。
所以正如我所说的,你的问题听起来像一个使用异常的好地方。如果正确使用RAII,内存分配绝对没有问题。也就是说,所有的内存释放都应该在对象的销毁过程中完成。即使抛出异常,仍然调用析构函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- 对于代码中指定的边界之外的值,对角差算法的输入不正确
- 使用 Get 的 C++ 输入被替换为空格、不正确的数字
- 当我输入分数值时,它返回不正确的结果
- 在具有 64 位 CPU 的 32 位 Win8 上运行 32 位 Orwell Dev-C++ - 输入指针返回不正确
- 计数排序我的输入是1,4,3,1但输出是垃圾值1,1,3输入不正确
- 我的 for 循环第一次正确输入,但第二次不正确,并显示第二个输入的输出。我不明白为什么会这样。
- 使用鞋帮不正确?直到我输入密码
- 如何处理不正确的输入文件
- 不正确的输入和读取
- 如何让C++忽略不正确的输入