关于panic ,主协程的recover 是无法获取 子协程的panic 的

一、子协程的panic,只能在子协程中处理

下面的代码,main 函数 无法获取panic
package main

import (
	"fmt"
	"time"
)

func main() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Println(e)
		}
	}()
	go test()
	time.Sleep(time.Second)
}

func test() {
	test1()
}
func test1() {
	panic("我错了")
}

二、子协程处理panic

package main

import (
	"fmt"
	"time"
)

func main() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Println(e)
		}
	}()

	go test()
	time.Sleep(time.Second)
}

func test() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Println(e)
		}
	}()
	test1()
}

func test1() {
	panic("我错了")
}

三、一个协程中才能后获取panic,最上层的能够获取下面的panic

如下代码main函数可以获取test1 函数中的panic
package main

import (
	"fmt"
)

func main() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Println(e)
		}
	}()

	test()
}

func test() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Println(e)
		}
	}()
	test1()
}

func test1() {
	panic("我错了")
}

关于recover 获取panic的原则

1、recover 只能获取同协程内的panic
2、defer 获取recover 只能在直接func 内获取,不能再跨一个func
3、panic(err)  err != nil
posted @ 2019-11-04 17:09  xiaobaiskill  阅读(1601)  评论(2编辑  收藏  举报