gin recovery 与 goroutine recover
Gin Recovery
Recovery返回一个中间件,该中间件从任何恐慌中恢复,并写入500(如果有)。当你的程序出现一些你未考虑到的异常时,程序就会退出,服务就停止了,所以这个中间件是有必要的。
gin.Default()返回一个已连接记录器和恢复中间件的引擎实例,即Logger 和 Recovery 中间件,我们在这里可以看到gin.Default本质上就是调用了gin.New,然后再Use Logger 和 Recovery这两个中间件
goroutine recover
goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理
package main import ( "fmt" "time" ) //goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。 func sayhello() { for i := 0; i < 10; i++ { time.Sleep(time.Second) fmt.Println("say hello") } } func test() { //这里可以使用错误处理机制defer + recover来解决 defer func() { //使用匿名函数捕获test抛出的panic //是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。 // recover仅在延迟函数中有效。 //在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。 //如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值, //并且恢复正常的执行。recover只有在defer调⽤的函数中有效。 if err := recover(); err != nil { fmt.Println("test 发生错误", err) } }() //定义了一个map var myMap map[int]string myMap[0] = "golang" //error //panic: assignment to entry in nil map } func main() { go sayhello() go test() for i := 0; i < 10; i++ { fmt.Println("ok") time.Sleep(time.Second) } }
recover函数的作用:
使用匿名函数捕获test抛出的panic
是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。
recover仅在延迟函数中有效。
在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。
如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,
并且恢复正常的执行。recover只有在defer调⽤的函数中有效。