防止goroutine崩溃同时也导致主进程崩溃
举个例子 比如这种情况 主进程会直接崩溃 看不到这个ok的打印
package main
import (
"log"
"time"
)
func Panic() {
panic(1)
}
func main() {
go Panic()
time.Sleep(1 * time.Second)
log.Println("OK")
}

这时使用这个函数
在panic之后主进程就不会崩溃了
可以看到这个ok打印出来
func NewRoutine(f func()) {
go func() {
defer func() {
// Recover from panic.
if err := recover(); err != nil {
stack := string(debug.Stack())
log.Println(err)
log.Println(stack)
}
}()
f()
}()
}
func Panic() {
panic(1)
}
func main() {
NewRoutine(Panic)
time.Sleep(1 * time.Second)
log.Println("OK")
}

因为这个函数里使用了recover 可以使panic的函数不会立刻返回 而是先defer 再返回
这样就避免了主进程崩溃的情况

浙公网安备 33010602011771号