«ответ» имеет значение null по крайней мере на одном пути выполнения в SonarQube

Я впервые использую SonarQube для анализа кода. У меня есть один метод, как показано ниже.

public async Task<HttpResponseMessage> SendRequest(HttpRequestMessage httpRequest)
{
    HttpClient client = new HttpClient();
    HttpResponseMessage response = null;            

    response = await client.SendAsync(httpRequest);

    if (response.StatusCode == System.Net.HttpStatusCode.RequestTimeout || response.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable)
    {
        //DoSomething
    }
    else
    {
       // DoSomethingElse
    }
 }

Теперь, когда я запускаю SonarQube, он указывает на условие if и показывает его как ошибку. Сообщение "'response' is null on at least one execution path.". Как мне удалить эту ошибку. Означает ли это, что весь этот блок if/else должен быть заключен в другое условие if, например if (response != null){}. Любая помощь/объяснение приветствуется.


person CrazyCoder    schedule 23.07.2018    source источник
comment
Что если объявить и инициализировать объект ответа только в одной строке?   -  person Rui Jarimba    schedule 23.07.2018
comment
@RuiJarimba Показано то же сообщение. Нет разницы.   -  person CrazyCoder    schedule 23.07.2018
comment
По неизвестной мне причине похоже, что await client.SendAsync(httpRequest) возвращает значение null. Я бы предложил написать if (response == null) { // DoUnspected Error } перед проверкой его свойств (StatusCode)   -  person Cleptus    schedule 23.07.2018


Ответы (1)


Хотя это маловероятно, await client.SendAsync может вернуть null, и анализатор хочет, чтобы вы проверили переменную на null.

Затем избегайте создания нового экземпляра HttpClient для каждого запроса, так как это может привести к истощению сокетов. Повторно используйте статический экземпляр (Singleton) как можно дольше.

static HttpClient client = new HttpClient();
public async Task<HttpResponseMessage> SendRequest(HttpRequestMessage httpRequest) {
    var response = await client.SendAsync(httpRequest);

    if(response == null) throw new InvalidOperationException();

    if (response.StatusCode == System.Net.HttpStatusCode.RequestTimeout ||
         response.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable)
    ) {
        // DoSomething
    } else {
        // DoSomethingElse
    }

    return response;
 }
person Nkosi    schedule 23.07.2018