Go语言错误处理:error与panic/recover的正确使用

Go语言错误处理:error与panic/recover的正确使用

引言

Go语言的错误处理以简单明确著称,主要通过error接口和panic/recover机制实现。本文将深入探讨这两种机制的使用场景,结合代码示例提供最佳实践。

error接口

Go使用error接口返回错误,推荐显式检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"errors"
"fmt"
)

func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}

func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("错误:", err)
return
}
fmt.Println("结果:", result)
}

解析error接口适合可预期的错误,鼓励显式处理。

panic与recover

panic用于不可恢复的错误,recover捕获panic:

1
2
3
4
5
6
7
8
9
10
11
12
13
func riskyOperation() {
defer func() {
if r := recover(); r != nil {
fmt.Println("恢复自panic:", r)
}
}()
panic("严重错误")
}

func main() {
riskyOperation()
fmt.Println("程序继续执行")
}

解析panic适用于程序无法继续运行的场景,recover应仅在必要时使用。

最佳实践

  • 优先使用error:日常错误处理使用error接口。
  • 谨慎使用panic:仅在初始化失败或致命错误时使用。
  • 结构化错误:使用errors.Wrap(github.com/pkg/errors)添加上下文。
  • 日志记录:集成zap记录错误详情。

总结

Go的错误处理通过errorpanic/recover提供了灵活的机制。合理选择错误处理方式,并结合结构化错误和日志记录,能提升代码健壮性。希望本文的示例为你的Go开发提供指导!