我努力寻找避免多个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语句之上)清理资源并提高可读性。有没有其他方法可以避免多次退货?
答案 0 :(得分:1)
您不需要诉诸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;
}