C# 在async/await中正确处理HttpClient异常
我希望有人能给我一点启发,告诉我在使用HttpClient处理异步/等待异常方面所面临的问题。我已经编写了一些代码来说明,它在Windows Phone 8设备和模拟器上都得到了验证: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();
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服务器的有效端点(可能是因为服务器没有更改它)。我搔了半个小时的头,在谷歌上搜索为什么这不是一个例外。你的回答真的很有帮助。这是处理这类事情的正确方法吗?将错误请求捕获为异常?非常感谢。