在异步/等待中正确处理 HttpClient 异常

本文关键字:正确处理 HttpClient 异常 等待 异步 | 更新日期: 2023-09-27 18:32:52

我希望有人能就我面临的一个关于 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);
        }
    }

点击调用此函数的按钮,在调试器控制台中生成以下输出,最有趣的是粗体输出:

开始错误请求:

System.Windows.ni 中发生类型为"System.Net.WebException"的异常.dll并且在托管/本机边界之前未处理

System.Windows.ni 中发生类型为"System.Net.WebException"的异常.dll并且在托管/本机边界之前未处理

mscorlib.ni 中发生了类型为"System.Net.Http.HttpRequestException"的第一次机会异常.dll

mscorlib.ni 中发生了类型为"System.Net.Http.HttpRequestException"的异常.dll并且在托管/本机边界之前未处理

捕获异常:

(这里它打印出 HttpRequestException(

当然,我预计在这种情况下会出现错误,因为我调用的 URL 是无稽之谈。我在这里不明白的是,当输出同时报告捕获异常时,为什么调试器报告未处理异常。此外,在打印输出时,应用程序的 UI 端的响应速度会降低得多,这表明可能有些不对劲。

这不是在使用异步和等待时处理异常的方法吗?我感谢任何意见!谢谢。

在异步/等待中正确处理 HttpClient 异常

当您使用

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

这是调试器的项目。它确定异常是"未捕获"的,因为它尚未捕获。在这种情况下,这是预期行为。

您正在正确处理异常。

调试器告诉您此异常是第一次机会。当调试器附加到进程时,它会收到引发的每个异常的通知,然后根据调试器的配置方式,它将决定如何处理它。你可以通过什么是第一次机会例外?了解更多详情。

附带说明一下,仅捕获特定异常,以便了解预期会出现哪些异常以及原因。