首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法以避免多次返回语句。

方法以避免多次返回语句。
EN

Stack Overflow用户
提问于 2017-02-17 05:04:46
回答 1查看 571关注 0票数 0

我努力寻找避免多个返回语句的方法,从而不会重复清理资源,这使我找到了以下方法:

  1. 如果错误不确定,则使用宏执行清理。 #定义EXE(x) if (OK != (err = x)) goto;ErrorCode func () { ErrorCode err = OK;EXE (fn1());EXE (fn2());清除: //清除资源返回err};
  2. 在发生错误时使用do...while()中断 ErrorCode func () { ErrorCode err = OK;do { err = fn1();if (err = OK)坏掉;err = fn2();if (err != OK)断;} while (false);//执行资源返回err};

这两种方法都允许在一个地方清理资源(紧接返回语句的上方),并提高可读性。还有其他方法可以避免多次返回吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 05:13:31

您不需要求助于goto来清理C++中的事务。在自动作用域中构造的所有对象都将被销毁。他们必须负责清理。

也就是说,您可以使用宏简化错误检查代码的编写。

代码语言:javascript
复制
#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

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42289800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档