Исключение обработки правильного пути для 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);           
}

Ответы

Ответ 1

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


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

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

MessageBox.Show(e.Message);

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

Ответ 2

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

  • Здесь я init веб-клиент в загруженном событии

    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"));
    }
    
  • Обратный вызов

    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
    }
    

Спасибо.

Ответ 3

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

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

-или -

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