Correctement la manipulation de la HttpClient des exceptions dans async / await
J'espérais que quelqu'un pourrait m'éclairer un peu sur une question, je suis confronté en ce qui concerne async/await gestion de l'exception avec HttpClient. J'ai écrit un code pour illustrer, et il est excecuted à la fois sur Windows Phone 8 dispositif et 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);
}
}
Appuyant sur le bouton qui appelle cette fonction, produit la sortie suivante dans la console du débogueur, le plus intéressant étant celles en gras:
COMMENCER DÉFECTUEUX DEMANDE:
Une exception de type 'System.Net.WebException' s'est produite dans System.Windows.ni.dll et n'a pas été traité avant géré/native limite
Une exception de type 'System.Net.WebException' s'est produite dans System.Windows.ni.dll et n'a pas été traité avant géré/native limite
Une exception de première chance de 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é traité avant géré/native limite
PRIS D'EXCEPTION:
(et ici, il imprime le HttpRequestException)
Bien sûr, je m'attends à une erreur dans ce cas depuis l'URL que j'ai fais appel est un non-sens. Ce que je ne suis pas de comprendre ici, c'est pourquoi le débogueur rapports que les exceptions ne sont pas traitées, lors de la sortie simultanée des rapports que l'exception est interceptée. Aussi, l'INTERFACE utilisateur de l'application devient beaucoup moins sensible alors que la sortie est en cours d'impression, indiquant que quelque chose est sans doute pas inutile.
Est-ce pas la façon de gérer les exceptions lorsque l'on travaille avec async et await? J'apprécie tous les commentaires! Merci.
BackgroundWorker
msdn.microsoft.com/en-us/library/...OriginalL'auteur Nils Holtar | 2013-09-26
Vous devez vous connecter pour publier un commentaire.
C'est un artefact du débogueur. Il est déterminé qu'une exception est "interceptée" parce qu'il n'est pas pris encore. Dans ce cas, c'est le comportement attendu.
Vous manipulez les exceptions correctement.
L'exception n'est pas gérée. il est caché (même si il est connecté à Déboguer.WriteLine qui n'apparaissent pas en mode Release). Lors de la construction de la libération, si le http appel échoue, vous ne saurez pas pourquoi (ou même pas).
Pour le code affiché dans la question, l'exception sera pris.
OriginalL'auteur
Que vous utilisez HttpClient, essayez d'utiliser
response.EnsureSuccessStatusCode();
Maintenant HttpClient lèvera une exception lorsque le statut de la réponse n'est pas un code de succès.
SOURCE D'ORIGINE DU CODE: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client
response
pour être de typeHttpResponseMessage
vous devez utiliserclient.GetAsync
au lieu declient.GetStringAsync
.J'ai essayé d'attraper des Demandes douteuses (400) comme des exceptions. Dans mon cas, mon application ne frappe pas valide d'un point de terminaison pour le serveur web (peut-être parce que le serveur n'a pas changé). J'ai été de me gratter la tête pendant une demi-heure, Googler pourquoi cela n'a pas d'attraper une exception. Votre réponse vraiment aidé. Est-ce la bonne façon de traiter avec ce genre de chose? Attraper un Mauvais Demande comme une exception? Je vous remercie.
OriginalL'auteur
Le débogueur est vous dire que c'est une exception de première chance. Lorsqu'un débogueur est attaché à votre processus, il est notifié pour chaque exception est levée puis en fonction de la façon dont le débogueur a été configuré, il sera de décider quoi faire avec elle. Vous pouvez aller à travers les Qu'est-ce que exception de première chance? pour plus de détails.
Sur une note de côté, d'attraper les exceptions spécifiques seulement de sorte que vous comprendre exceptions qui vous attendent et pourquoi.
OriginalL'auteur