在 while 循环中实现重试

implementing retry in 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--;
}

这看起来对吗?

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

我唯一要做的改变是

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

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

您所做的似乎不错,但可能比需要的更复杂。

例如,您不需要设置退出标志,您只需调用 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;
    }
}