在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异常

在 webapi 中正确使用 await async

kotlin协程async await的异常踩坑以及异常处理的正确姿势

kotlin协程async await的异常踩坑以及异常处理的正确姿势

kotlin协程async await的异常踩坑以及异常处理的正确姿势

教你正确打开async/await关键字的使用