我正在尝试在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--;
}
这看起来我正在做什么吗?
答案 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
而不是设置标记,除非您计划使用标记来区分由于条件而找到匹配或退出。