我如何重构代码以便在C#应用程序中删除break语句

时间:2019-02-05 07:54:02

标签: c# sonarqube break

我有一个C#Windows应用程序,使用以下代码在其中调用API:

while (true)
{
    try
    {
        using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
        {
            requestMessage.Headers.Add("Accept", "application/json");                                
            response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);                             
        }
        break; // where the code smells is shown
    }
    catch (TaskCanceledException )
    {
        if (++attemptCount > 3)
        {
            throw;
        }
        Thread.Sleep(10000);
    }
    catch (Exception ex2)
    {
        throw;
    }
}

通常,发生网络问题时,会取消对API的get请求。所以我要做的是,每当任务被取消时,我都会尝试三次。如果它不起作用,则将调用方法抛出异常。如果在这3次尝试中都成功,那么我将打破循环。

现在,当我对代码运行声纳分析时,它显示要删除break语句并重构代码。任何人都可以在这里帮助我。我不知道如何重构它。

任何帮助或提示都将受到高度赞赏。非常感谢!

4 个答案:

答案 0 :(得分:1)

while (true)是一个无限循环。 相反,我宁愿使用(布尔)变量来检入while()。 这样您就有机会将此变量设置为false并避免使用break

答案 1 :(得分:0)

您通常不应该使用while (true)(这是一个潜在的无限循环),即使您在某处有break语句,有时也可能会发生无法到达该语句的情况。

我建议您使用for循环:

for (int i = 0; i < 3; i++)
{
    try
    {
        using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
        {
            requestMessage.Headers.Add("Accept", "application/json");                                
            response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);                             
        }
    }
    catch (TaskCanceledException)
    {
        Thread.Sleep(10000);
    }
    catch (Exception ex2)
    {
        throw;
    }
}

答案 2 :(得分:0)

创建一个名为success的布尔变量,并将其用作while循环条件:

boolean success = false;
while (!success) {
    try
    {
        using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "Some URL"))
        {
            requestMessage.Headers.Add("Accept", "application/json");                                
            response = await myHttpHelper.SendHttpRequest(requestMessage).ConfigureAwait(false);                             
        }
        success = true; <--- set to true here
    }
    ...
}

答案 3 :(得分:0)

如果您不喜欢Polly,我建议同时使用@Sweeper和@Magnus的回复:

MyObject newest = Collections.max(myObjectList, Comparator.comparing(LocalDate.parse(MyObject::getDate)));

这样,您可以控制重试次数,并且在请求成功时跳出循环。