避免多个return语句的方法

时间:2017-02-17 05:04:47

标签: c++ return

我努力寻找避免多个return语句的方法,以便清理资源不会重复,这让我找到了以下方法:

  1. 使用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;
    }
    
  2. 发生错误时使用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;
    }
    
  3. 这两种方法都允许在一个地方(紧靠return语句之上)清理资源并提高可读性。有没有其他方法可以避免多次退货?

1 个答案:

答案 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;
}