假设我正在编写包装C样式API的类。

int cstyleInit()
int cstyleCleanup()

通常,方法是将cstyleInit()放入我的构造函数中,将cstyleCleanup()放入析构函数中,但是我的问题是,如何处理构造函数中初始化失败的问题?

简单的方法如下:
MyWrapper::MyWrapper()  {
    int ret = cstyleInit()
    if (ret = FAILUREMODE1) {
        cstyleCleanup();
        throw exception("failure mode 1");
    }
    else if (ret = FAILUREMODE2) {
        cstyleCleanup();
        throw exception("failure mode 2");
    }
    ...
}

据我所知,这可以正常工作。唯一的(次要)问题是,您必须为每种故障模式显式调用cstyleCleanup(),这对我来说似乎不是RAII。

我知道这是一个小问题,但是还有更多的c++ / RAII方法吗?

最佳答案



它与RAII并没有真正的关系,但可能与在包装API以抛出特定错误代码的示例时避免重复代码有关。
该API是否没有类似ret != NOFAILURE的功能,使您能够独立于所有这些专业而调用cstyleCleanup();

MyWrapper::MyWrapper() {
   int ret = cstyleInit()
   if (ret != NOFAILURE) {
       cstyleCleanup();
   }
   // Your exception mapping code ...
}

09-16 08:18