Я сделал базовый метод расширения, чтобы добавить функцию повтора в мой HttpClient.PostAsync
:
public static async Task<HttpResponseMessage> PostWithRetryAsync(this HttpClient httpClient, Uri uri, HttpContent content, int maxAttempts, Action<int> logRetry)
{
if (maxAttempts < 1)
throw new ArgumentOutOfRangeException(nameof(maxAttempts), "Max number of attempts cannot be less than 1.");
var attempt = 1;
while (attempt <= maxAttempts)
{
if (attempt > 1)
logRetry(attempt);
try
{
var response = await httpClient.PostAsync(uri, content).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
return response;
}
catch (HttpRequestException)
{
++attempt;
if (attempt > maxAttempts)
throw;
}
}
}
Приведенный выше код дает мне следующую ошибку:
Ошибка CS0161 'HttpClientExtensions.PostWithRetryAsync(HttpClient, Uri, HttpContent, int, Action)': не все пути кода возвращают значение.
Если я добавлю throw new InvalidOperationException()
в конец (или return null
, если на то пошло), ошибка исчезнет, как ожидалось. То, что я действительно хотел бы знать, это: есть ли какой-либо путь кода, который фактически выходит из этого метода без возвращаемого значения или генерируемого исключения? Я не вижу этого. Знаю ли я больше, чем компилятор в этом случае, или это наоборот?