WebClient.DownloadString
を使用する場合、どのような例外から身を守るべきか迷っていました。
これが私が現在それを使用している方法ですが、皆さんはより強力な例外処理を提案できると確信しています。
たとえば、頭の上から:
これらのケースを処理し、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
で例外をキャッチしないでください。呼び出し側のメソッドにバブルアップし、そこでキャッチしてメッセージを表示します...
私はこのコードを使用します:
ここで、I 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
}
ありがとう。
私は通常、このように処理して、リモートサーバーが返す例外メッセージを出力します。ユーザーがその値を見ることが許可されていると仮定します。
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);
}
MSDNドキュメント によると、プログラマ以外の唯一の例外はWebException
で、次の場合に発生します。
BaseAddressとアドレスを組み合わせて形成されたURIは無効です。
-または-
リソースのダウンロード中にエラーが発生しました。