Исключение обработки правильного пути для 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 и адреса, недействителен.
-или -
При загрузке ресурса произошла ошибка.