Как я могу реорганизовать код для удаления оператора break в приложении c # - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть приложение ac # 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;
    }
}

Обычно, когда происходит какая-либо проблема с сетью, обычно происходит запрос get к API, который отменяется.,Итак, что я сделал, когда задание отменяется, я пробую это три раза.Если это не сработает, я добавлю исключение в вызывающий метод.Если это успешно с этими 3 попытками, я разрываю петлю.

Теперь, когда я запускаю гидролокаторный анализ своего кода, он показывает, что нужно удалить оператор прерывания и изменить код. Может кто-нибудь помочь мне здесь.Я не могу понять, как это сделать.

Любая помощь или подсказка высоко ценится.Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Если вы не пойдете с Полли, я бы порекомендовал комбинацию ответа @ Sweeper's и @Magnus:

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

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

        success = true; 
    }
    // Exception handling
}

Таким образом, вы контролируете количество попыток и прыжкавне цикла при успешном выполнении запроса.

0 голосов
/ 05 февраля 2019

Обычно вы не должны использовать 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 голосов
/ 05 февраля 2019

Создайте логическую переменную с именем 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 голосов
/ 05 февраля 2019

while (true) - бесконечный цикл.Вместо этого я бы предпочел использовать (логическую) переменную для регистрации while().Это дает вам возможность установить эту переменную на false и избежать break.

...