我努力寻找避免多条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/

10-13 03:27