go语言的异常处理

本文探讨了Go语言中的Error类型错误处理,如何使用recover捕获并处理panic异常,包括分母为0、空指针和空map赋值等常见错误。同时指出recover只能捕获当前协程的错误,子协程的错误处理限制以及系统级别错误,如死锁、数据竞争和内存溢出,这些会导致程序直接崩溃且无法捕获。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值