如何在发生异常时保存已完成的内容?

一个经典的场景:
1、读取保存在 txt 文件中的 url
var 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);
    }
}

阅读 2k
1 个回答

Pythoner

一般都边爬边保存吧,所以如果报错的话,之前爬的也保存过了。

捕获异常不代表程序结束啊,可以继续执行,然后把报错的URL保存下来重试。

如果是文本数据,可以爬的时候存在一个数组里,统一保存,不过这种方法并没有啥优势啊。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题