在async / await中正确处理HttpClient异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在async / await中正确处理HttpClient异常相关的知识,希望对你有一定的参考价值。
我希望有人能启发我一些有关使用HttpClient进行异步/等待异常处理的问题。我已经写了一些代码来说明,并且它已在Windows Phone 8设备和仿真器上执行:
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);
}
}
点击调用此功能的按钮,在调试器控制台中产生以下输出,最有趣的是bold中的输出:
BEGIN故障请求:
System.Windows.ni.dll中发生了'System.Net.WebException类型的异常,在受管理/本地边界之前未进行处理
System.Windows.ni.dll中发生了'System.Net.WebException类型的异常,在受管理/本地边界之前未进行处理
类型为'System.Net.Http.HttpRequestException'的第一次机会异常发生在mscorlib.ni.dll中
[类型为'System.Net.Http.HttpRequestException的异常,发生在mscorlib.ni.dll中,在受管理/本机边界之前未得到处理
意外例外:
(这里打印出HttpRequestException)
当然,在这种情况下,我期望出现错误,因为我正在调用的URL毫无意义。我在这里不明白的是,当输出同时报告捕获到异常时,调试器为何报告未处理异常。同样,在输出输出时,应用程序的UI端响应速度将大大降低,表明可能有问题。
这不是使用异步和等待时处理异常的方法吗?感谢您的投入!谢谢。
这是调试器的构件。由于未捕获yet,因此确定异常是“未捕获”的。在这种情况下,这是预期的行为。
您正在正确处理异常。
当您使用HttpClient时,请尝试使用response.EnsureSuccessStatusCode();
现在,当响应状态不是成功代码时,HttpClient将引发异常。
try
{
HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
response.EnsureSuccessStatusCode(); // Throw if not a success code.
// ...
}
catch (HttpRequestException e)
{
// Handle exception.
}
代码的原始来源:http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client
调试器告诉您此异常是第一次机会。将调试器附加到您的进程后,它会针对抛出的每个异常得到通知,然后根据调试器的配置方式,决定如何处理它。您可以通过What is first chance exception?了解更多详细信息。
附带说明,仅捕获特定的异常,以便您了解预期的异常以及原因。
以上是关于在async / await中正确处理HttpClient异常的主要内容,如果未能解决你的问题,请参考以下文章
在async / await中正确处理HttpClient异常
kotlin协程async await的异常踩坑以及异常处理的正确姿势
kotlin协程async await的异常踩坑以及异常处理的正确姿势