web-dev-qa-db-fra.com

Gérer correctement les exceptions HttpClient dans async/wait

J'espérais que quelqu'un pourrait m'éclairer un peu sur un problème auquel je suis confronté en ce qui concerne le traitement asynchrone/wait des exceptions avec HttpClient. J'ai écrit du code à illustrer, et il est exécuté à la fois sur un périphérique Windows Phone 8 et sur l'émulateur:

    private async void SearchButton_Click(object sender, EventArgs e)
    {
        try
        {
            HttpClient client = new HttpClient();
            System.Diagnostics.Debug.WriteLine("BEGIN FAULTY REQUEST:");
            string response = await client.GetStringAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
            System.Diagnostics.Debug.WriteLine("SUCCESS:");
            System.Diagnostics.Debug.WriteLine(response);
        }
        catch (Exception exception)
        {
            System.Diagnostics.Debug.WriteLine("CAUGHT EXCEPTION:");
            System.Diagnostics.Debug.WriteLine(exception);
        }
    }

Le fait d'appuyer sur le bouton qui appelle cette fonction génère la sortie suivante dans la console du débogueur, la plus intéressante étant celle de audacieux:

COMMENCEZ LA DEMANDE PAR DÉFAUT:

Une exception de type 'System.Net.WebException' s'est produite dans System.Windows.ni.dll et n'a pas été gérée avant une limite gérée/native

Une exception de type 'System.Net.WebException' s'est produite dans System.Windows.ni.dll et n'a pas été gérée avant une limite gérée/native

Une exception de première chance du type 'System.Net.Http.HttpRequestException' s'est produite dans mscorlib.ni.dll

Une exception de type 'System.Net.Http.HttpRequestException' s'est produite dans mscorlib.ni.dll et n'a pas été gérée avant une limite gérée/native

CAUGHT EXCEPTION: (Et ici l’impression de l’exception HttpRequestException)

Bien sûr, je m'attends à une erreur dans ce cas puisque l'URL que j'appelle est absurde. Ce que je ne comprends pas, c’est pourquoi le débogueur signale que les exceptions ne sont pas gérées, alors que la sortie indique simultanément que l’exception est interceptée. En outre, le côté interface utilisateur de l'application devient beaucoup moins sensible lors de l'impression du résultat, ce qui indique que quelque chose ne va pas.

N'est-ce pas la façon de gérer les exceptions lorsque vous travaillez avec async et wait? J'apprécie n'importe quelle entrée! Merci.

10
Nils Holtar

Ceci est un artefact du débogueur. Cela détermine qu'une exception est "non capturée" car elle n'est pas capturée pour le moment . Dans ce cas, il s'agit du comportement attendu.

Vous gérez les exceptions correctement.

7
Stephen Cleary

Pendant que vous utilisez HttpClient, essayez d’utiliser response.EnsureSuccessStatusCode();

Maintenant, HttpClient lève une exception lorsque l’état de la réponse n’est pas un code de réussite.

try
{
    HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    // ...
}
catch (HttpRequestException e)
{
    // Handle exception.
}

SOURCE ORIGINALE DU CODE: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

25
mirushaki

Le débogueur vous dit que cette exception est une première chance. Lorsqu'un débogueur est attaché à votre processus, il reçoit une notification pour chaque exception générée. Ensuite, en fonction de la configuration du débogueur, il décide quoi en faire. Vous pouvez passer par Quelle est l'exception de la première chance? pour plus de détails.

Sur une note de côté, attrapez uniquement des exceptions spécifiques afin de comprendre quelles exceptions vous attendez et pourquoi.

0
Anupam