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

标签 c++ exception

我正在开始一个项目,我想知道在文件输入处理过程中处理错误的最佳实践。我当前的项目计划涉及 main 中的一个过程,大致如下:

unique_ptr<Configuration> config(initConfig(argc,argv));
unique_ptr<InterfaceA> a(initA(config));

// Do real work here

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

#ObjectA-1

ObjectA 告诉我我有一个文件要转换成满足 InterfaceA 的对象,而 1 告诉我具体哪个要使用的该接口(interface)的实现。

我的问题是关于 initConfiginitA 等函数的错误处理。在这些函数中,我将解析它们各自文件的第一行,并对上述信息进行解码。如果,比方说,在 initA 中,我碰巧得到一个没有适当 header 的文件,无论是 #ObjectB-3,还是根本没有 header 。我看到了两种处理错误的方法:

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

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

如果不是为了使用 exit 函数,我个人更喜欢第二个。

最佳答案

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

  1. 调用代码是否应该处理异常事件?如果是这样,抛出异常。有时“异常(exception)”很难定义,所以更像是“这应该发生吗?”我认为在这种情况下,您应该抛出异常,main 应该处理它们如果有意义。

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

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

  2. 它是一个被认为是正常的并且可以被调用代码忽略的错误吗?这可能是对错误代码的恰当使用。

  3. 这是您代码内部的逻辑错误吗?这作为 assert 更有意义。您应该使用 assert 来验证您正在做的事情是否确实有意义。一个愚蠢的例子是 int y = 5; y++;断言(y == 6);。将其视为防止愚蠢错误的保险。

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

关于c++ - 如何处理不正确的输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15912355/

相关文章:

c++ - 找不到 qgsapplication.h 和其他头文件

php - 为什么 PDO 抛出 ErrorException 而不是 PDOException?

c++ - 当 QMainWindow 调整大小时,QDockWidget 分割器会跳转

C++ 4.8 运行时堆损坏

c++ - 通用 lambda 的元数

C++ 读取文本很长的文件

java - 如何在 Android 中读取文本文件?

android - "already added"ormlite 和 gradle 异常

c++ - 使用 std::string 时出现 bad_alloc 错误

delphi - 如何找出从 Delphi 应用程序发送 MadExcept 错误报告的结果