Go 中错误处理策略

120 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

前言

在 Go中没有异常,只有错误。在函数调用返回错误时,应该检查错误然后使用合适的措施处理它。遇到错误常用的操作:要么就是判断然后返回错误,或者重试,或者记录错误并停止。

返回错误

最常见的方法是直接返回错误。 这样子例程中的失败就会直接将错误结果返回给调用者。

在以下示例中,如果调用 http.Getfails,则返回 HTTP 错误,无需进一步处理。

resp, err := http.Get(url)
if err != nil {
        return "", err
}

为了统一错误类型和返回,有必要将一些对错误的描述进行封装。比如使用函数 fmt.Errorf 用字符串包装错误消息。 它包括请求 URL 和错误消息,并且 URL 是调试的必要信息。这样报错时可以更加直观的看到问题。

if err != nil {
  return nil, fmt.Errorf("url %s request error: %s", url, err)
}

返回的错误信息应该包含足够信息,这样有利于开发者或者用户对问题的理解。当然开发者需要更多错误上下文相关的信息,而用户更多是使用上的错误提示。

重试

第二种处理错误的方式时重试,这种适用场景时在一些瞬态错误情况,调用者进行重试操作。详细可看下之前写过的一篇文章》

func FetchURLWithRetry(url string, timeout time.Duration) (*html.Node, error) {
    // 判断重试次数,有一次成功就结束
    // 若三次都失败则全部失败结束
}

记录并继续

在某些情况下,可以接收错误的发生。 在这种情况下,错误会被记录下来,程序会继续运行。

for _,val := range values {
    _, err := FetchURL(val)
        if err != nil {
            log.Printf("FetchURL: %v", err)
            continue
        }
}

记录并停止程序

第四种错误处理策略是停止程序。 main 函数一般应该使用这种策略来终止程序。

if err != nil {
        log.Fatal(err)
    }

在处理代码时遇到错误情况时必不可少的,所以可以根据相应的场景选择适当的解决方案,解决错误的问题。