我如何重构代码,以消除在C#应用程序break语句

问题描述 投票:0回答:4

我从那里我正在使用下面的代码API调用一个C#Windows应用程序:

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;
    }
}

通常发生的事情是当过有一些网络发出GET请求的API被取消。所以我所做的是每当任务就是让取消了,我尝试它的三倍。如果它不工作,那么我抛出一个异常调用方法。如果它是成功的,在这3次尝试,我打破循环。

现在,当我在我的代码运行声纳分析,它显示删除break语句和重构code.Can谁能帮助我在这里。我无法弄清楚如何重构它。

任何帮助或暗示的高度赞赏。非常感谢!

c# sonarqube break
4个回答
1
投票

while (true)是一个无限循环。相反,我宁愿用(布尔)变量while()检查。这让你有机会使用这个变量来false,避免break


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;
    }
}

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
    }
    ...
}

0
投票

如果你不与波莉去,我会建议的@扫乐和@Magnus'答复组合:

const int retryLimit = 3;
boolean success = false;
int retryCounter = 0;

while (!success
        && retryCounter++ < retryLimit) {
    try
    {
        // http request as is

        success = true; 
    }
    // Exception handling
}

这样,您控制重试次数和跳出循环的时候请求成功。

© www.soinside.com 2019 - 2024. All rights reserved.