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