Diskuze: try-catch chyba
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zrovna od moderátora C# fóra, bych čekal že umí googlovat.
Anyway ...
http://social.msdn.microsoft.com/…04-not-found
http://stackoverflow.com/…file-request
EDIT: jen taková poznámka, že 404 je "stránka nenalezena" takže máš chybnou adresu
To si snad děláš srandu, ne? Co tam pohledává ten
bool error
? Hezky se ho zbav. Fuj, to jsem se lekl.
Aha, to by to vysvětlovalo. Já měl zato, že je moderátor C#
Tak jsem to zkusil znovu (asi po 4.) se stejnou url adresou a už mi chybu nevyhodilo, ale mě ani tak nešlo o tu chybu, ale proč mi to zastavilo když tam mám try-catch blok
ten bool zajišťuje, že pokud se to nepovede stáhnout tak to nebude pokračovat, ale přeskočí to všechno co vyžaduje mít stažený ten string
Abych nebyl jen destruktivní. Tady jsem ti přepsal ten kousek, který vidím na obrázku. Proměnná error je v daném případě fakt zbytečná.
tracklist.Clear();
foreach (string s in uris) {
try {
string xmlFile = webClient.DownloadString(...));
XmlDocument _doc = new XmlDocument();
_doc.LoadXML(xmlFile);
} catch (WebException) {
Console.Error.WriteLine("Chybička se vloudila");
}
}
V podstatě je zbytečná i proměnná xmlFile, ale to už záleží na vkusu.
právě že sem tam mi vyhodí chybu i jiný řádek, a to já se snažím vyřešit, ne jen že když to vyhodí chybu tak se to neprovede, pokud bych to tak udělal, mohlo by se taky stát že výsledek hledání by byl nula výsledků
Na tom snímku se špatně rozeznává, co s tím pak dál děláš, ale stejně jsem přesvědčen, že proměnná error je tam naprosto zbytečná a jen zhoršuje čitelnost programu, ve kterém se pak špatně hledají chyby.
řekl bych že v tomhle
var id = _doc.SelectSingleNode("//id");
var duration = _doc.SelectSingleNode("//duratoion");
var tag_list = _doc.SelectSingleNode("//tag-list");
var streamable = _doc.SelectSingleNode("//streamable");
var genre = _doc.SelectSingleNode("//genre");
var title = _doc.SelectSingleNode("//title");
var description = _doc.SelectSingleNode("//description");
var original_format = _doc.SelectSingleNode("//original-format");
var permalink_url = _doc.SelectSingleNode("//permalink-url");
var artwork_url = _doc.SelectSingleNode("//artwork-url");
var waveform_url = _doc.SelectSingleNode("//waveform-url");
var stream_url = _doc.SelectSingleNode("//stream-url");
var playback_count = _doc.SelectSingleNode("//playback-count");
var download_count = _doc.SelectSingleNode("//download-count");
var favouriting_count = _doc.SelectSingleNode("//favoritings-count");
var comment_count = _doc.SelectSingleNode("//comment-count");
var user_name = _doc.SelectSingleNode("//user");
se líp hledá chyba bez try-catche, protože mi VS zvýrazní ve kterém řádku mám chybu
Podobně nepochopitelné je i proč dáváš do xmlFile hodnotu String.Empty. To je přece naprosto zbytečné přiřazení, které jen zdržuje a znepřehledňuje program.
A jak to s tím souvisí? Tohle je přece úplně jiný případ z jiné vrstvy.
Tak jsem to přepsal:
XmlDocument _doc = new XmlDocument();
_doc.LoadXml(webClient.DownloadString(s + clientTemplate + client_id));
ale pořád se může stát že mi server vrátí 404 a alespoň vím že try-catch je v tomto případě zbytečný
Ta výjimka ti probublá do vyšší vrstvy.
Případně to můžeš vyřešit třeba takto:
http://stackoverflow.com/…can-i-skip-t
Zkusil jsem to tam přidat, a uvidím až zase nastane 404ka jestli to pomohlo
Tak si tam nějaký neexistující odkaz přidej, ať víš, jak se to bude chovat.
Nevím kdo mi dal i--, ale opravdu to ten kód nepřeskočí (mluvím o tom, co nám ukázal jako první) protože nevyvolává žádnou vyjímku, takže program normalně bude postupovat dál.
Už vím jak,
try { _doc.LoadXml(webClient.DownloadString(s)); }
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
HttpWebResponse resp = (HttpWebResponse)e.Response;
if (resp.StatusCode == HttpStatusCode.NotFound)
{
MessageBox.Show("Not found");
}
else if (resp.StatusCode == HttpStatusCode.Unauthorized)
{
MessageBox.Show("Unauthorized");
}
}
}
mi zastaví program (nezobrazí MessageBox) s chybou:
The remote server returned an error: (401) Unauthorized.
To už vypadá lépe. Ještě trochu zlepšit úpravu kódu, aby se to dalo číst...
Zobrazeno 23 zpráv z 23.