1. Error类型错误
此类错误无需特殊处理, 需要判断时添加如下判断即可
if err != nil {
//错误处理逻辑
}
2. 可被recover捕获的错误
- 主动抛出panic异常
- 分母为0错误
- 空指针错误
- 空map赋值错误等
如上所属的错误是可以被recover捕获的, 需注意的是recover只能捕获当前协程的错误, 在程序中创建子协程是无法捕获子协程中的错误的, 且如果子协程未作处理会直接导致整个程序崩溃
package main
import "fmt"
type A struct {
a int
}
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
// 主动抛出异常
panic("抛出异常")
// 分母为0
c, d := 1, 0
fmt.Println(c / d)
// 空指针错误
var v *A
fmt.Println(v.a)
// 空map赋值错误
var v2 map[string]*A
v2["a"] = new(A)
}
子协程无法捕获
package main
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
go func() {
panic("抛出异常")
}()
}
3. 系统级别错误
- 死锁
- 数据竞争, 比如在多个协程中操作同一个map
- 内存溢出
上述错误会直接导致程序崩溃且无法被recover捕获,
出现上述错误请优化程序