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

C# 在async/await中正确处理HttpClient异常,c#,.net,asynchronous,windows-phone-8,async-await,C#,.net,Asynchronous,Windows Phone 8,Async Await,我希望有人能给我一点启发,告诉我在使用HttpClient处理异步/等待异常方面所面临的问题。我已经编写了一些代码来说明,它在Windows Phone 8设备和模拟器上都得到了验证: private async void SearchButton_Click(object sender, EventArgs e) { try { HttpClient client = new 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);
        }
    }
点击调用此函数的按钮,在调试器控制台中生成以下输出,最有趣的是粗体输出:

开始错误请求:

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”的异常,在托管/本机边界之前未处理该异常

捕获的异常:

(这里它打印出HttpRequestException)

当然,我希望在这种情况下会出现错误,因为我调用的URL是无意义的。这里我不理解的是,当输出同时报告异常被捕获时,调试器为什么报告异常未被处理。此外,在打印输出时,应用程序的UI端的响应性会大大降低,这表明可能有什么问题


使用async和Wait时,这不是处理异常的方法吗?我感谢任何意见!谢谢。

这是调试器的工件。它确定异常是“未捕获的”,因为它尚未捕获。在这种情况下,这是预期的行为


您正在正确处理异常。

调试器告诉您此异常是第一次出现。当调试器连接到您的进程时,它会收到抛出的每个异常的通知,然后根据调试器的配置方式决定如何处理它。你可以浏览更多细节


另一方面,只捕获特定的异常,以便了解预期的异常以及原因。

在使用HttpClient时,请尝试使用
响应。EnsureSessAccessStatusCode()

现在,当响应状态不是成功代码时,HttpClient将抛出异常

try
{
    HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    // ...
}
catch (HttpRequestException e)
{
    // Handle exception.
}

代码的原始来源:

就响应性而言,您不应该在UI事件中运行长流程。这些应该是快速的,长时间运行的进程应该在另一个线程中完成。试试
BackgroundWorker
我认为它被标记为“uncaught”,因为它不是由用户代码捕获的,而是由TPL捕获的。异常没有被处理。它是隐藏的(即使它被记录到Debug.WriteLine中,但在发布模式下不会出现)。当内置版本时,如果http调用失败,您将不知道原因(甚至不知道失败)。@Stuart:对于问题中发布的代码,将捕获异常。谢谢,我将阅读!我同意你的观点,我的实际情况是不同的,我写这篇文章只是为了说明我的问题。如果你想
response
HttpResponseMessage
类型,你必须使用
client.GetAsync
而不是
client.GetStringAsync
。我一直在尝试捕获错误请求(400)作为例外。在我的例子中,我的应用程序没有命中Web服务器的有效端点(可能是因为服务器没有更改它)。我搔了半个小时的头,在谷歌上搜索为什么这不是一个例外。你的回答真的很有帮助。这是处理这类事情的正确方法吗?将错误请求捕获为异常?非常感谢。