我希望有人可以通过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”类型的异常,并且在托管/本地边界之前未处理
CAUGHT EXCEPTION: (这里打印出HttpRequestException)
当然我希望在这种情况下出错,因为我打电话的网址是无意义的。我在这里不理解的是,当输出同时报告异常被捕获时,调试器报告未处理异常的原因。此外,应用程序的UI端在打印输出时变得反应迟钝,表明某些事情可能不对。
使用异步和等待时,这不是处理异常的方法吗?我感谢任何输入!感谢。
答案 0 :(得分:27)
在使用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
答案 1 :(得分:7)
这是调试器的工件。它确定异常是“未被捕获”的,因为它没有被捕获 。在这种情况下,这是预期的行为。
您正在正确处理异常。
答案 2 :(得分:0)
调试器告诉你这个异常是第一次机会。当调试器附加到您的进程时,它会收到每个引发的异常的通知,然后根据调试器的配置方式,它将决定如何处理它。您可以浏览What is first chance exception?了解更多详情。
在旁注中,仅捕获特定的例外,以便您了解您期望的例外情况和原因。