go语言的异常处理

文章目录

  • 1. Error类型错误
  • 2. 可被recover捕获的错误
  • 3. 系统级别错误

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捕获,
出现上述错误请优化程序

你可能感兴趣的:(go)