如何处理不正确的输入文件

How to handle improper input files

本文关键字:不正确 输入 文件 处理 何处理      更新时间:2023-10-16

我正在开始一个项目,我想知道在文件输入处理过程中处理错误的最佳实践。我目前的项目计划包括main中的一个流程,如下所示:

unique_ptr<Configuration> config(initConfig(argc,argv));
unique_ptr<InterfaceA> a(initA(config));
// Do real work here

Configuration类和所有其他类的初始化数据将包含在其输入文件的头文件中,例如:

#ObjectA-1

ObjectA告诉我,我有一个文件,打算变成一个对象,满足InterfaceA, 1告诉我,该接口的具体实现使用。

我的问题是在错误处理功能,如initConfiginitA。在这些函数内部,我将解析它们各自文件的第一行,并解码上述信息。如果,让我们说,在initA我碰巧得到一个文件,没有适当的头,无论是#ObjectB-3,或根本没有头。我看到了两种处理错误的方法:

  • 抛出将在main中捕获的异常。这将允许我打印一个错误,然后通过错误标志绕过其他init函数,并进行我需要的任何高级清理。这样做的不好的部分是我的main主要是由异常处理组成的,这使得代码更难阅读。

  • 从init函数内部打印一个错误,然后调用exit(EXIT_FAILURE)并依靠我的操作系统来清理先前分配的内存。这可能会导致更干净的代码和更多的本地错误处理。

如果没有使用exit函数,我个人更喜欢第二种。

我使用以下规则来执行错误处理:

  1. 如果可以,调用代码是否应该处理异常事件?如果是,抛出异常。有时候"异常"很难定义,所以不妨把它想象成"这种情况应该发生吗?"我认为在这种情况下,你应该抛出异常,main应该处理它们如果是有意义的。

    标准定义了两组异常。首先是那些继承自std::logic_error的。当调用代码破坏了函数的契约时,通常会抛出这些问题。然后是那些从std::runtime_error继承的错误,它们用于只能在运行时检测到的错误。这听起来和你的一模一样。它只在读取文件时才知道文件有问题。

    当然,如果你愿意,你也可以抛出你自己的异常类型

  2. 这是一个被认为是正常的错误,可以被调用代码忽略吗?这可能是错误码的适当使用

  3. 是代码内部的逻辑错误吗?作为assert,这更有意义。您应该使用assert s来验证您所做的实际上是有意义的。int y = 5; y++; assert(y == 6);就是一个愚蠢的例子。

所以正如我所说的,你的问题听起来像一个使用异常的好地方。如果正确使用RAII,内存分配绝对没有问题。也就是说,所有的内存释放都应该在对象的销毁过程中完成。即使抛出异常,仍然调用析构函数