2013-09-26 20 views
8

我希望有人能够就我在使用HttpClient进行异步/等待异常处理时遇到的问题进行一点点启发。我已经写一些代码来说明,并且它是被同时获得Windows电话8装置和仿真器上excecuted:在async/await中正确处理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); 
     } 
    } 

攻丝调用该功能的按钮时,产生在调试器控制台以下输出,最有趣的是在大胆的那些:

BEGIN FAULTY REQUEST:

型“System.Net.WebException”的异常出现在System.Windows.ni.dll和管理之前没有处理/本地边界

型“System.Net.WebException”的异常出现在System.Windows.ni.dll和管理/本地边界

类型的第一次机会异常“系统之前没有处理。 Net.Http.HttpRequestException”发生在mscorlib.ni.dll

类型的异常‘System.Net.Http.HttpRequestException’发生在mscorlib.ni.dll和管理/本地边界之前没有处理

被拒绝例外: (在这里它打印出HttpRequestException)

当然,我期待在这种情况下的错误,因为我打电话的URL是无稽之谈。这里我不理解的是调试器报告说异常未被处理的原因,当输出同时报告异常被捕获时。此外,应用程序的UI侧在输出正在打印时变得非常不敏感,表明可能有错误。

这是不是在处理异步和等待时处理异常的方式?我感谢任何输入!谢谢。

+2

至于响应你不应该在UI事件上运行一个漫长的过程。这些应该是快速的,长时间运行的过程应该在另一个线程中完成。试试'BackgroundWorker' http://msdn.microsoft.com/en-us/library/System.ComponentModel.BackgroundWorker.aspx – Harrison

回答

6

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

您正在正确处理异常。

+2

我会说它被标记为“uncaught”,因为它没有被用户代码捕获,但是通过TPL。 – usr

+0

未处理异常。它是隐藏的(即使它被记录到Debug.WriteLine中,它不会以释放模式出现)。在发布版本中构建时,如果http调用失败,您将不知道为什么(或甚至失败)。 – Stuart

+0

@Stuart:对于发布在问题中的代码,将会捕获异常。 –

0

调试器告诉你,这个异常是第一次机会。当一个调试器连接到你的进程时,它将得到所有抛出的异常的通知,然后根据调试器的配置方式,它将决定如何处理它。您可以通过What is first chance exception?了解更多详情。

在旁注上,仅捕获特定的异常,以便了解您期望的异常以及原因。

+0

谢谢,我会读一读!我同意你的一面说明,我的实际情况是不同的,我只是写这个来说明我的问题。 –

22

当您使用HttpClient的,尽量使用response.EnsureSuccessStatusCode();

现在的HttpClient会抛出异常,当响应状态不是成功代码。参加CODE

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

+3

如果您希望'response'为'HttpResponseMessage'类型,则必须使用'client.GetAsync'而不是'client.GetStringAsync'。 – kaolick