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调⽤的函数中有效。

posted @ 2022-10-17 11:43  Mr.peter  阅读(417)  评论(0编辑  收藏  举报