避免多个返回语句的方法

Methods to avoid multiple return statements

本文关键字:语句 方法 返回      更新时间:2023-10-16

我为避免多个返回陈述的方法而做出的努力,因此清理资源不会重复,使我找到了以下方式:

  1. 使用宏,如果错误不正常,请进行清理。

    #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;
    }
    

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

您无需求助于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;
}