golang捕获错误怎么重新开始运行?

    Feeds, items, _ := FetchFeeds(url)
    if Feeds == nil {
        fmt.Print("time out")
    } 

这段代码是一个爬虫获取url的时候,由于网站是国外的,所以有时候会timeout,在timeout的时候怎么让他从FetchFeeds()函数重新开始呢。我想到的是用递归,但是递归会不会一直增加开销啊?

已邀请:

stevewang

赞同来自: nino

FetchFeeds返回的第三个参数是错误吧?一般都是通过检查错误来决定后续处理的,通常超时这种错误也会包含在错误返回值里。

这种逻辑用循环处理就可以,用递归反而导致代码更复杂更难维护:

for {
    Feeds, items, err := FetchFeeds(url)
    if err != nil {
        if err == ErrTimeout {
            // 超时重试,可等待一定时间后继续,也可以检查重试的次数限制
            continue
        }
        // 处理不可恢复的错误,比如记录日志等
        break
    }
    // 处理获取到的数据
    break
}

fengche

赞同来自:

goto

傅小黑

赞同来自:

递归没有问题。不过一般来说如果是爬虫都是有任务调度的。有任务调度就会有任务队列,把失败的扔回队列在执行,比放在实际处理业务逻辑的地方做重试更好。

leoliu

赞同来自:

复杂一点就像上面小黑说的, 简单一点的就goto

nino

赞同来自:

goto我也尝试过,但是效果不太好。队列我没有尝试过,我想我可以试试。:-D

要回复问题请先登录注册