我努力寻找避免多条return语句的方式,以致不会重复进行资源清理,这导致我发现了以下几种方式:
如果错误不正确,请使用MACRO进行清理。
#define EXE(x) if (OK != (err = x)) goto cleanup;
ErrorCode func ()
{
ErrorCode err = OK;
EXE (fn1());
EXE (fn2());
cleanup:
// do cleanup of resources
return err;
}
使用do ... while()在发生错误时中断
ErrorCode func ()
{
ErrorCode err = OK;
do
{
err = fn1();
if (err != OK) break;
err = fn2();
if (err != OK) break;
} while (false);
// do cleanup of resources
return err;
}
两种方式都可以在一处(紧接在return语句上方)清理资源并提高可读性。还有其他方法可以避免多次退货吗?
最佳答案
您无需诉诸goto
来清理C ++中的内容。在自动作用域中构造的所有对象将被销毁。他们必须负责清理。
也就是说,您可以使用宏来简化错误检查代码的编写。
#define CHECK_ERROR(x) if (OK != x) return x;
ErrorCode func ()
{
ErrorCode err = OK;
err = fn1();
CHECK_ERROR(err);
err = fn2();
CHECK_ERROR(err);
return err;
}
更新,以回应OP的评论
使用帮助程序类来调用
CloseHandle
。struct HandlerMinder
{
HandleMinder(ErrorCode& err, HANDLE hObject) :
err_(err), hObject_(hObject) {}
~HandleMinder()
{
// Adapt the logic to suit your needs.
if ( err_ != OK )
{
CloseHandle(hObject_);
}
}
ErrorCode& err_;
HANDLE hObject_;
};
ErrorCode func ()
{
ErrorCode err = OK;
HANDLE object = <some handle>;
HandleMinder m(err, object);
err = fn1();
CHECK_ERROR(err);
err = fn2();
CHECK_ERROR(err);
return err;
}
关于c++ - 避免多个return语句的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42289800/