异常处理 WebClient.DownloadString 的正确方法
本文关键字:方法 WebClient DownloadString 异常处理 | 更新日期: 2023-09-27 17:56:38
我想知道在使用WebClient.DownloadString
时应该保护自己免受哪些异常的影响。
这是我目前使用它的方式,但我相信你们可以建议更好更强大的异常处理。
例如,在我的头顶上:
- 没有互联网连接。
- 服务器返回 404。
- 服务器超时。
处理这些情况并将异常抛向 UI 的首选方法是什么?
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);
}
如果你抓住WebException
,它应该可以处理大多数情况。 WebClient
和 HttpWebRequest
为所有 HTTP 协议错误(4xx 和 5xx)以及网络级别错误(断开连接、无法访问主机等)抛出WebException
我如何从 UI 捕获此内容以在消息框中显示错误?
不确定我是否理解你的问题...您不能只显示异常消息吗?
MessageBox.Show(e.Message);
不要在FindUpcomingGamesByPlatform
中捕获异常,让它冒泡到调用方法,在那里捕获它并显示消息......
我通常这样处理它以打印远程服务器返回的任何异常消息。鉴于允许用户查看该值。
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);
}
我使用以下代码:
-
在这里,我
init
Web客户端加载的事件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 }
谢谢。
根据 MSDN 文档,唯一的非程序员例外是 WebException
,如果出现以下情况,可以引发:
由基址和地址组合而成的 URI 无效。
-或-
下载资源时出错。