Causa dell’errore CS0161: non tutti i percorsi di codice restituiscono un valore

Ho creato un metodo di estensione di base per aggiungere HttpClient.PostAsync funzionalità al mio HttpClient.PostAsync :

 public static async Task PostWithRetryAsync(this HttpClient httpClient, Uri uri, HttpContent content, int maxAttempts, Action logRetry) { if (maxAttempts < 1) throw new ArgumentOutOfRangeException(nameof(maxAttempts), "Max number of attempts cannot be less than 1."); var attempt = 1; while (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; } } } 

Il codice precedente mi dà il seguente errore:

Errore CS0161 ‘HttpClientExtensions.PostWithRetryAsync (HttpClient, Uri, HttpContent, int, Action)’: non tutti i percorsi di codice restituiscono un valore.

Se aggiungo il throw new InvalidOperationException() alla fine (o return null per quella questione), l’errore scompare come previsto. Quello che mi piacerebbe davvero sapere è: esiste un percorso di codice che in realtà esca da questo metodo senza che venga restituito alcun valore o che venga lanciata un’eccezione? Non riesco a vederlo. Conosco più del compilatore in questo caso, o è il contrario?