如何在Go语言中有效捕获和处理错误,避免遗漏?

go 没有类似php的try catch 如果项目大了 有些地方漏了if err的判断 能通过什么知道哪里出错了?太坑了吗 try catch 这种捕获异常都没。比如有些请求第三方接口的 超时了没判断到 这种错误哪里能看

搜索

阅读 669
2 个回答

1 ​​统一错误处理中间件​​, 在 Web 框架(Gin/Echo)中定义全局错误处理:

// Gin 示例
router.Use(func(c *gin.Context) {
    c.Next() // 执行业务逻辑
    if len(c.Errors) > 0 {
        err := c.Errors.Last()
        log.Error(err.Err)
        c.JSON(500, gin.H{"error": err.Error()})
    }
})

2 自定义错误类型​​,通过 errors.New() 或 fmt.Errorf 封装上下文:

if err := db.Query(); err != nil {
    return fmt.Errorf("query user failed: %w", err) // %w 包裹底层错误
}

3 错误断言处理​​,针对特定错误类型处理:

if err := process(); err != nil {
    if e, ok := err.(*CustomError); ok {
        // 处理自定义错误
    }
}

优先推荐:golangci-lint

  • 集成了errcheck和其他20多个检查器
  • 一个工具解决多个问题
  • 配置灵活,可以只启用需要的检查器
  • 社区维护活跃

安装和使用:

# 安装
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

# 运行
golangci-lint run

# 只检查错误处理
golangci-lint run --enable errcheck

配置文件 .golangci.yml

linters:
  enable:
    - errcheck      # 检查未处理的错误
    - govet         # Go官方检查器
    - ineffassign   # 检查无效赋值
    - misspell      # 检查拼写错误
    - gosec         # 安全检查

linters-settings:
  errcheck:
    check-type-assertions: true
    check-blank: true

运行时监控推荐:Sentry

对于生产环境错误追踪:

import "github.com/getsentry/sentry-go"

func init() {
    sentry.Init(sentry.ClientOptions{
        Dsn: "your-dsn-here",
    })
}

func main() {
    defer sentry.Flush(2 * time.Second)
    // 你的代码
}

实际使用建议:

  1. 开发阶段:用golangci-lint检查代码
  2. CI/CD:集成golangci-lint到流水线
  3. 生产环境:用Sentry或类似工具监控运行时错误
推荐问题