1. 我是皮皮虾首页
  2. 编程开发
  3. 后端
  4. Goland

go协程中,main中无法捕获子协程的panic

在go中,虽然协程很好用,但是需要注意捕获他的异常,不如在生产环境中,子协程panic了,你的整个服务都会挂掉

错误示例

package main
import (
 "fmt"
 "time"
)
func main() {

  defer func() {
    r := recover()
    fmt.Println("recover r:",r)
  }()

  // 启动一个协程
  go func() {
    panic("start panic")
  }()
  // block 一下主协程
  time.Sleep(1 * time.Second)
  fmt.Println("done")
}

正确用法

package main

import (
	"fmt"
	"time"
)

func main() {
	defer func() {
		r := recover()
		fmt.Println("recover r:", r)
	}()
	// 启动一个协程
	go func() {
		defer func() {
			r := recover()
			fmt.Println("recover goroutine r:", r)
		}()
		panic("start panic")
	}()
	// block 一下主协程
	time.Sleep(1 * time.Second)
	fmt.Println("done")
}

原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/1839/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注