在while循环中实现重试

时间:2015-05-13 18:08:33

标签: c++ while-loop

我正在尝试在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变为true,那么我将退出循环
  • 第二种情况,如果flag为false 5次,那么我也会退出循环。

这看起来我正在做什么吗?

4 个答案:

答案 0 :(得分:3)

就像@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. */ }

答案 1 :(得分:2)

如果您仅为此目的使用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;
    }
}

答案 2 :(得分: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 :(得分:1)

我要做的唯一改变是

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而不是设置标记,除非您计划使用标记来区分由于条件而找到匹配或退出。