Правильная обработка исключений для WebClient.DownloadString - PullRequest
14 голосов
/ 14 мая 2011

Мне было интересно, от каких исключений я должен защищаться при использовании 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);           
}

Ответы [ 4 ]

15 голосов
/ 14 мая 2011

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


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

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

MessageBox.Show(e.Message);

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

5 голосов
/ 10 мая 2012

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

  1. Здесь я 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"));
    }
    
  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
    }
    

Спасибо.

1 голос
/ 14 мая 2011

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

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

-или-

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

0 голосов
/ 14 марта 2019

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

try
{
    getResult = client.DownloadString(address);
}
catch (WebException ex)
{
    String responseFromServer = ex.Message.ToString() + " ";
    if (ex.Response != null)
    {
        using (WebResponse response = ex.Response)
        {
            Stream dataRs = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataRs))
            {
                responseFromServer += reader.ReadToEnd();
            }
        }
    }
    _log.Error("Server Response: " + responseFromServer);
    MessageBox.Show(responseFromServer);
}
...