定义
- panic
- 改变程序控制流
- 立即停止当前函数剩余代码,调用defer
- 只会执行当前协程的defer
- recover
- 可以终止panic造成的程序崩溃
- 只能在defer中发挥作用
package mainimport ("fmt""time"
)func main() {defer func() {fmt.Println("main——不是panic的协程的defer")}()go func() {defer func() {fmt.Println("panic协程——defer——执行recover")if err := recover(); err != nil{fmt.Println("panic协程——recover协程拉起:",err)}}()defer func() {fmt.Println("panic协程——defer——什么都不做")}()a := 0fmt.Println(23/a)//panic("go die")fmt.Println("panic协程——after go die, can i print")//panic之后不回调用defer func() {fmt.Println("panic协程——defer——panic发生后面定义")}()}()//没啥作用if err := recover(); err != nil{fmt.Println("main——非panic协程拉起")}fmt.Println("main——panic after(跑的比较快)")time.Sleep(time.Second * 3)fmt.Println("main——panic after time")
}
输出
main——panic after(跑的比较快)
panic协程——defer——什么都不做
panic协程——defer——执行recover
panic协程——recover协程拉起: runtime error: integer divide by zero
main——panic after time
main——不是panic的协程的defer