Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理不正确的输入文件_C++_Exception - Fatal编程技术网

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

C++ 如何处理不正确的输入文件,c++,exception,C++,Exception,我正在启动一个项目,我想知道在文件输入处理过程中处理错误的最佳实践。我目前的项目计划涉及main中的一个流程,大致如下: unique_ptr<Configuration> config(initConfig(argc,argv)); unique_ptr<InterfaceA> a(initA(config)); // Do real work here ObjectA告诉我有一个文件要转换成满足InterfaceA的对象,1告诉我该接口的具体实现 我的问题是关于函

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

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

// Do real work here
ObjectA
告诉我有一个文件要转换成满足
InterfaceA
的对象,
1
告诉我该接口的具体实现

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

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

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


如果不是为了使用退出功能,我个人更喜欢第二个

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

  • 如果可以的话,调用代码应该处理这种异常情况吗?如果是,抛出一个异常。有时“异常”很难定义,所以更像是“这种情况是否会发生?”我认为在这种情况下,您应该抛出异常,
    main
    应该处理它们,如果这样做有意义的话

    该标准定义了两组例外情况。首先是从
    std::logic\u error
    继承的。这些通常在调用代码破坏了函数的契约时抛出。还有一些是从
    std::runtime\u error
    继承的,用于只能在运行时检测到的错误。这听起来和你的一模一样。它只有在读取文件时才知道文件有问题

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

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

  • 这是代码内部的逻辑错误吗?作为
    断言
    ,这更有意义。您应该使用
    assert
    s来验证您所做的实际操作是否有意义。一个愚蠢的例子是
    inty=5;y++;断言(y==6)。把它看作是防止愚蠢错误的保险


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

    既然使用C++,有没有使用RAII的原因?老实说,我已经把所有这些行都写成了代码>配置配置(ARCC,ARGV);接口a(配置)。不需要内存管理。问题是我需要逻辑来确定要创建哪种类型的
    A
    。@GodricSeer哦,好的,然后
    配置(argc,argv);共享的ptr a(接口a::fromConfig(配置))
    @sftrabbit我知道使用共享的ptr将消除我的内存管理,但是我不理解
    a(interfaceea::fromConfig(config))
    。InterfaceA有纯粹的虚拟方法,所以我不能以这种方式拥有它的构造函数。
    #ObjectA-1