【问题标题】:implementing retry in while loop在while循环中实现重试
【发布时间】:2015-05-14 02:27:23
【问题描述】:

我正在尝试在 while 循环中实现重试。如果标志为真,我想重试 5 次。

bool flag = false;
unsigned int count = 5;
while(!flag && count > 0) {
    DataOperation opt = DataUser::Insert(data_point);
    if(opt == DataOperation::DataEnum) {
        UserPointData exist = DataUser::FindUser(data_point->user_id());
        if(exist) {
           exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
            flag = true;
        }
    } else {
        // insert in data_point
        data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
        flag = true;
    }
    count--;
}
  • 所以如果flag为真,那么我将退出循环
  • 第二种情况,如果flag 5次为false,我也会退出循环。

这看起来对我正在做的事情吗?

【问题讨论】:

  • 而不是将标志设置为 true,您可以在循环外使用 break;

标签: c++ while-loop


【解决方案1】:

就像@Borgleader 指出的那样,flag 变量是不必要的。您可以坚持使用break 指令并在循环后检查计数是否仍大于零。如果是,则意味着您的任务成功了。

unsigned int count = 5;
while(count > 0) {
    DataOperation opt = DataUser::Insert(data_point);
    if(opt == DataOperation::DataEnum) {
        UserPointData exist = DataUser::FindUser(data_point->user_id());
        if(exist) {
           exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
            break; // success.
        }
    } else {
        // insert in data_point
        data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
        break; // success.
    }
    count--;
}

if (count > 0) { /* succeeded within 5 tries. */ }

【讨论】:

    【解决方案2】:

    你正在做的事情看起来不错,但可能比它需要的更复杂。

    例如你不需要设置一个标志来退出你可以简单地调用break;

    这是我有时使用的一种可能更简单的模式:

    bool succeed_at_doing_stuff()
    {
        std::cout << "trying" << '\n';
        return false;
    }
    
    int main()
    {
        int retries = 3;
    
        while(retries--) // will exit when retries == 0, retries then becomes -1
        {
            if(succeed_at_doing_stuff())
                break; // no need to set a flag
    
            // take alternative action
        }
    
        if(retries < 0) // retries was decremented after last check
        {
            std::cerr << "error: gave up - too many retries" << std::endl;
            return 1;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您仅将count 变量用于此目的,我建议您使用for 循环,这样count 将不可见,并且在退出循环范围后将回收它的内存。并使用break 语句立即退出循环。

      for(auto count = 0; count<5; ++count) {
          DataOperation opt = DataUser::Insert(data_point);
          if(opt == DataOperation::DataEnum) {
              UserPointData exist = DataUser::FindUser(data_point->user_id());
              if(exist) {
                 exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
                  break;
              }
          } else {
              // insert in data_point
              data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
              break;
          }
      }
      

      【讨论】:

        【解决方案4】:

        我要做的唯一改变是

        if(opt == DataOperation::DataEnum) {
            UserPointData exist = DataUser::FindUser(data_point->user_id());
            if(exist) {
               exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
                flag = true;
            } else {
              count--;
            }
        

        我不喜欢你将计数设置为 5 然后倒计时,因为如果你递增直到达到 5 会更明显,但这会起作用。

        您可能想要break 而不是设置标志,除非您计划使用标志来区分查找匹配或因条件而退出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          • 1970-01-01
          • 2015-12-24
          • 2020-07-12
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          相关资源
          最近更新 更多