WebException не происходит, где это должно? - PullRequest
0 голосов
/ 27 сентября 2010

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

var task = Task.Factory.StartNew(() =>
{
    while (!bc.IsCompleted && !cts.Token.IsCancellationRequested)
    {
        PriorityDownloadPair pd;
        if (bc.TryTake(out pd))
        {
            var baseUri = pd.Value.Uri;
            Console.WriteLine("({0}) {1}", pd.Key, baseUri.AbsoluteUri);
            IEnumerable<HtmlNode> sq = null;
            try
            {
                sq = SharpQuery.SharpQuery.Load(baseUri);
            }
            catch (WebException we)
            {
                Console.WriteLine(we.Message);
                continue;
            }
            foreach (var node in sq.Find("a[href]"))
            {
                bc.Add(new PriorityDownloadPair(1, new DownloadItem { Uri = new Uri(baseUri, node.Attributes["href"].Value) }));
            }
        }
    }
}, cts.Token);

Он работает некоторое время (следуя и скачивая каждую найденную ссылку), пока не достигнет 404.

404 происходит в методе SharpQuery.Load, как я и ожидал:

public static IEnumerable<HtmlNode> Load(Uri uri)
{
    var doc = new HtmlDocument();
    WebClient wc = new WebClient();
    using (var str = wc.OpenRead(uri))
        doc.Load(str);
    yield return doc.DocumentNode;
}

Но тогда почему мой блок try не ловит его?

Если я поднимаюсь по стеку вызововвместо этого она указывает на эту строку:

foreach (var node in sq.Find("a[href]"))

Но sq.Find даже не касается веб-интерфейсов.Что происходит?

Эти строки синхронны,

        using (var str = wc.OpenRead(uri))
            doc.Load(str);

Не так ли?Не должно ли появиться сообщение об ошибке по дороге после завершения загрузки?

1 Ответ

1 голос
/ 27 сентября 2010

Это потому, что загрузка не выполняется до тех пор, пока вы на самом деле не прочитаете данные, то есть после блока try.

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