28

我希望有人能对我在使用 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 和 await 时处理异常的方法吗?我很感激任何意见!谢谢。

4

3 回答 3

49

当您使用 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

于 2014-09-02T11:34:23.437 回答
11

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

您正在正确处理异常。

于 2013-09-26T18:11:00.213 回答
0

调试器告诉你这个异常是第一次机会。当调试器附加到您的进程时,它会收到有关抛出的每个异常的通知,然后根据调试器的配置方式,它将决定如何处理它。你可以通过什么是第一次机会例外?更多细节。

附带说明一下,仅捕获特定异常,以便您了解您期望的异常以及原因。

于 2013-09-27T02:33:37.860 回答