image

关键字介绍

panicpanicjavathrowrecoverrecoverjavatry ... catch

使用

panic
panicpanicdefer
panic
package main
import "fmt"
func main() {
    // 第一个协程
    go func() {
       
        var i int
        for {
            i++
            fmt.Println("协程1")
            time.Sleep(1*time.Second)
             // 3秒后发生panic
            if i==3 {
                panic("异常退出")
            }
        }
    }()
    // 第二个协程
    go func() {
        for  {
            fmt.Println("协程2")
            time.Sleep(1*time.Second)
        }
    }()
    // 让主协程不退出
    for  {
        time.Sleep(1*time.Second)
    }
}
panic("异常退出")
协程2
协程1
协程2
协程1
协程2
协程1
协程2
panic: 异常退出
goroutine 6 [running]:
main.main.func1()
        /home/zheng/STUDY/GoWork/demo/main.go:28 +0xb9
created by main.main
        /home/zheng/STUDY/GoWork/demo/main.go:15 +0x35
panicrecovery
panicgorecoverygoroutinepanicrecoverydeferrecoverypanicpanicdefer
recovery
// 第一个协程
go func() {
    // 捕获异常
    defer func() {
        err:=recover()
        fmt.Printf("捕获的:%s\n",err)
    }()
    
    var i int
    for {
        i++
        fmt.Println("协程1")
        time.Sleep(1*time.Second)
        // 3秒后发生panic
        if i==3 {
            panic("异常退出")
        }
    }
}()
  • 输出:
协程2
协程1
协程1
协程2
协程2
协程1
协程2
捕获的:异常退出
协程2
协程2
...
recoverypanic