关于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("我错了")
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM