【发布时间】:2013-04-01 11:56:58
【问题描述】:
我正在启动一个项目,我想知道在文件输入处理期间处理错误的最佳实践。我目前对该项目的计划涉及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 中捕获的异常。这将允许我打印错误,然后通过错误标志绕过其他初始化函数,并进行任何我需要的高级清理。不好的部分是我的
main主要是由异常处理组成的,这使得代码更难阅读。从 init 函数内部打印一个错误,然后调用
exit(EXIT_FAILURE)并依靠我的操作系统来清理以前分配的内存。这可能会导致更简洁的代码和更多的本地错误处理。
如果不是为了使用exit 函数,我个人更喜欢第二个。
【问题讨论】:
-
既然您使用的是 C++,您是否有理由不使用 RAII?
-
老实说,我会把所有这些行都写成
Configuration config(argc, argv); InterfaceA a(config);。无需内存管理。 -
问题是我需要逻辑来确定要创建哪种类型的
A。 -
@GodricSeer 哦,好吧,然后
Configuration config(argc, argv); shared_ptr<InterfaceA> a(InterfaceA::fromConfig(config));。 -
@sftrabbit 我知道使用 shared_ptr 会消除我的内存管理,但是我不理解
a(InterfaceA::fromConfig(config))。 InterfaceA 有纯虚方法,所以我不能以这种方式拥有它的构造函数。