在async/await中正确处理HttpClient异常

Nil*_*tar 13 .net c# asynchronous async-await windows-phone-8

我希望有人可以通过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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

开始故障请求:

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

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

mscorlib.ni.dll中出现'System.Net.Http.HttpRequestException'类型的第一次机会异常

mscorlib.ni.dll中出现"System.Net.Http.HttpRequestException"类型的异常,并且在托管/本地边界之前未处理

CAUGHT EXCEPTION :(此处打印出HttpRequestException)

我当然希望在这种情况下出错,因为我调用的URL是无意义的.我在这里不理解的是,当输出同时报告异常被捕获时,调试器报告未处理异常的原因.此外,应用程序的UI端在打印输出时变得反应迟钝,表明某些事情可能不对.

在使用异步和等待时,这不是处理异常的方法吗?我感谢任何输入!谢谢.

mir*_*aki 30

在使用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.
}
Run Code Online (Sandbox Code Playgroud)

该代码的原始来源:http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

  • 如果你想``response`是`HttpResponseMessage`类型,你必须使用`client.GetAsync`而不是`client.GetStringAsync`. (3认同)

Ste*_*ary 7

这是调试器的工件.它确定一个例外是"未捕获的",因为它没有抓到.在这种情况下,这是预期的行为.

您正在正确处理异常.

  • 我说它被标记为"未被捕获",因为它没有被用户代码捕获,而是被TPL捕获. (2认同)