假设我正在编写包装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 ...
}