骨气|除夜雪三候·荔挺出——生命的能量场里没有弱者
2683 2026-07-21 18:10
panic会将这个特别很是及机制不竭向上抛出 ,直到有中心措置它 ,措置假如有措置 ,及机制则不会再向上抛出。措置借使假定没有措置,及机制那么幻想下场会招致main挂损掉落踪落.
golang当然没有try catch机制,措置却有一种近似的及机制recover机制 ,后续demo我们可以不美不美不雅察到它的措置用法和感染
func main() { defer func() { if err := recover(); err != nil { log.Println("err:", err) } }() go test1() time.Sleep(time.Second * 3) panic(errors.New("stop test1")) log.Println("123") select { }}func test1() { for { tm := time.NewTicker(time.Second) select { case <-tm.C: log.Println("test1") } }}
func main() { defer func() { if err := recover(); err != nil { log.Println("err:", err) } }() go test1() time.Sleep(time.Second * 3) makeerr() log.Println("123") select { }} func test1() { for { tm := time.NewTicker(time.Second) select { case <-tm.C: log.Println("test1") } }}func makeerr() { defer func() { if err := recover(); err != nil { log.Println("makeerr:", err) } }() panic(errors.New("stop"))}
此时我们在func顶用recover ,那么挂损掉落踪落的及机制只是func,他不会抛到main中,措置所以main能延续运转 ,及机制继而main斥地的措置go test1也能延续运转
func main() { defer func() { if err := recover(); err != nil { log.Println("err:", err) } }() time.Sleep(time.Second * 3) makeerr() log.Println("123") select { }} func test1() { for { tm := time.NewTicker(time.Second) select { case <-tm.C: log.Println("test1") } }}func makeerr() { defer func() { if err := recover(); err != nil { log.Println("makeerr err:", err) } }() go test1() panic(errors.New("stop test"))}
我们创作创造 ,func当然挂损掉落踪落了,及机制可是措置他草创的go没挂损掉落踪落,因为即就是及机制这个函数介入了,新开的协程是相当于基于main下的一个子程 ,只需main不介入,他还是会“存活”
func main() { defer func() { if err := recover(); err != nil { log.Println("err:", err) } }() go test1() time.Sleep(time.Second * 3) log.Println("123") select { }}func test1() { log.Println("test1 start") panic(errors.New("stop test1")) log.Println("test1 end")}
协程中假定没recover ,那么error就会抛向main,main就会挂损掉落踪落,从而没有奉行到后背的log打印。
---> 这类气候 ,main中做defer recover是没用的
func main() { test1() time.Sleep(time.Second * 3) log.Println("123")}func test1() { log.Println("test1 start") test2() log.Println("test1 end")}func test2() { defer func() { if err := recover(); err != nil { log.Println("test2 err:", err) } }() log.Println("test2 start") panic(errors.New("stop test2")) log.Println("test2 end")}
func main() { test1() time.Sleep(time.Second * 3) log.Println("123")}func test1() { defer func() { if err := recover(); err != nil { log.Println("test? err:", err) } }() log.Println("test1 start") test2() log.Println("test1 end")}func test2() { log.Println("test2 start") panic(errors.New("stop test2")) log.Println("test2 end")}
func2特别很是,奉行延续,向调用者func1抛出进而本身介入,func1掉落踪掉落踪特别很是,奉行延续 ,本身介入时recover举办措置 ,从而保活了main
到此这篇关于golang panic及措置机制的文章就引见到这了,更多相干golang panic内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !