一个经典的场景:
1、读取保存在 txt 文件中的 urlvar urls = ReadAllLines(txt)
2、下载网页内容var webs = await GetStringAsync(urls)
3、爬取图片var imgs = ExtratImages(webs)
4、保存图片到本地await SaveAsync(imgs)
步骤2 可能发生异常,当然其他方法也可能发生异常,所以我采取捕捉全局异常!我希望捕捉异常并弹出消息框提示,而且将以获取的内容继续执行。
例如:
1、读取了 txt 中的全部 url(共10条)
2、下载 url 内容(在下载第7条网页内容时发生异常)
3、弹出信息框
我的解决方案:
Task Main()
{
var pages = new List<string>();
try
{
// ...
var urls = ReadAllLines(txt);
(error, pages) = await GetAllPagesAsync(urls);
// 之所以我返回 error,是因为如果在 GetAllPagesAsync 内部抛出异常的话,
// 该方法无法返回已获取的网页内容返回给 pages,
// 也就是说,如果发生异常,pages 是空的。
// 已经获取到的内容将丢失。
// 但这种方式好丑,有更好的解决方法吗?
if(error != null)
{
throw error;
}
// ...
}
catch (Exception)
{
// Log error.
// Show message box.
}
finally
{
var imgs = ExtratImages(pages);
await SaveAsync(imgs);
}
}
Pythoner
一般都边爬边保存吧,所以如果报错的话,之前爬的也保存过了。
捕获异常不代表程序结束啊,可以继续执行,然后把报错的URL保存下来重试。
如果是文本数据,可以爬的时候存在一个数组里,统一保存,不过这种方法并没有啥优势啊。