在异步/等待中正确处理 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 时,请尝试使用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.
}
代码的原始来源:
这是调试器的项目。它确定异常是"未捕获"的,因为它尚未捕获。在这种情况下,这是预期行为。
您正在正确处理异常。
调试器告诉您此异常是第一次机会。当调试器附加到进程时,它会收到引发的每个异常的通知,然后根据调试器的配置方式,它将决定如何处理它。你可以通过什么是第一次机会例外?了解更多详情。
附带说明一下,仅捕获特定异常,以便了解预期会出现哪些异常以及原因。