2011-05-14 2 views
13

Мне было интересно, какие исключения я должен защитить от использования при использовании WebClient.DownloadString.Исключение обработки правильного пути для WebClient.DownloadString

Вот как я его сейчас использую, но я уверен, что вы, ребята, можете предложить более надежную обработку исключений.

Например, с верхней части моей головы:

  • Нет подключения к Интернету.
  • Восстановленный сервер 404.
  • Время ожидания сервера.

Каков предпочтительный способ обработки этих случаев и исключения исключений из пользовательского интерфейса?

public IEnumerable<Game> FindUpcomingGamesByPlatform(string platform) 
{ 
    string html; 
    using (WebClient client = new WebClient()) 
    { 
     try 
     { 
      html = client.DownloadString(GetPlatformUrl(platform)); 
     } 
     catch (WebException e) 
     { 
      //How do I capture this from the UI to show the error in a message box? 
      throw e; 
     } 
    } 

    string relevantHtml = "<tr>" + GetHtmlFromThisYear(html); 
    string[] separator = new string[] { "<tr>" }; 
    string[] individualGamesHtml = relevantHtml.Split(separator, StringSplitOptions.None); 

    return ParseGames(individualGamesHtml);   
} 

ответ

13

Если вы поймаете WebException, он должен обрабатывать большинство случаев. WebClient и HttpWebRequest бросить WebException для всех ошибок протокола HTTP (4xx и 5xx), а также на наличие ошибок сетевого уровня (отключение, хост не доступен и т.д.)


Как захватить это из пользовательского интерфейса для показать ошибку в окне сообщения?

Я не уверен, что понимаю ваш вопрос ... Разве вы не можете просто показать сообщение об исключении?

MessageBox.Show(e.Message); 

Не поймать исключение в FindUpcomingGamesByPlatform, пусть он пузыриться вызывающему методу, поймать его и показать сообщение ...

+0

См. Править. –

+0

обновил мой ответ –

+0

Спасибо Томас, я думаю, я спрашивал, как пузырить ошибку исключения. :) –

1

По the MSDN documentation, единственным исключением не-программист WebException, которые могут быть подняты, если:

URI, образованный путем объединения BaseAddress и адреса, недействителен.

-или-

при загрузке ресурса произошла ошибка.

5

Я использую этот код:

  1. Здесь я init в WebClient Whithin загруженного события

    private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) 
    { 
        // download from web async 
        var client = new WebClient(); 
        client.DownloadStringCompleted += client_DownloadStringCompleted; 
        client.DownloadStringAsync(new Uri("http://whateveraurisingis.com")); 
    } 
    
  2. Функция обратного вызова

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
        #region handle download error 
        string download = null; 
        try 
        { 
        download = e.Result; 
        } 
    catch (Exception ex) 
        { 
        MessageBox.Show(AppMessages.CONNECTION_ERROR_TEXT, AppMessages.CONNECTION_ERROR, MessageBoxButton.OK); 
        } 
    
        // check if download was successful 
        if (download == null) 
        { 
        return; 
        } 
        #endregion 
    
        // in my example I parse a xml-documend downloaded above  
        // parse downloaded xml-document 
        var dataDoc = XDocument.Load(new StringReader(download)); 
    
        //... your code 
    } 
    

Спасибо.

Смежные вопросы