У меня есть кусок кода, который выглядит следующим образом:
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);
Не так ли?Не должно ли появиться сообщение об ошибке по дороге после завершения загрузки?