世界上最伟大的投资就是投资自己的教育

全场限时 5 折

首页Golang
随风 · 练气

前端程序员学习 Golang gin 框架实战笔记之三 panic 和 recovery

随风发布于3657 次阅读

上一节:前端程序员学习 Golang gin 框架实战笔记之二分析 context

1. Logger

我把上一节 main.go 的代码换了:

gin.New() 换成了 gin.Default()

上一节我们说过,Default 多了两个中间件:

// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
    debugPrintWARNINGDefault()
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

Logger 这个好理解,你用 postman 访问后,是这样的:

在终端上多了一个输出的日志显示。

它可以点开看它的代码的,它就返回了一个中间件:

有一个 c.Next() 值得注意,其他语言也是有这个类似的方法,表示传给下个中间件处理,以后我们自己写中间件,就要用它。

最后它只是一个输出语句。

2. Recovery

Recovery 这个中间件呢?

这里要讲到两个关键词 panic 和 recover。

下面引用网上大佬的解释:

有点晦涩。

我来解释下:

panic 你可以理解成 js 或 java 的 throw ,但又不一样,它表示的是中断运行。

看下这个:

func main() {
    defer println("in main")
    go func() {
        defer println("in goroutine")
        panic("")
    }()
    println("after main")

    time.Sleep(1 * time.Second)
}

在协程中,panic 就立马中断了后面的执行,但又会执行它自己的 defer。

最后这个 defer println("in main") 是没有执行的。

我们把它改一下:

func main() {
    defer fmt.Println("in main")
    go func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered: Error:\n", r)
            }
        }()
        panic("a problem occurred")
    }()
    fmt.Println("after main")

    time.Sleep(1 * time.Second)
}

结果是这样的:

你要在 defer 里调 recover 恢复中断的程序。

我们这个中间件做的事跟这个就有些类似:

你可以试下:

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        panic("not implemented")
        c.JSON(http.StatusOK, gin.H{
            "message": "Hello World!",
        })
    })
    r.Run()
}

加了中间件,访问后,结果是这样的:

它这里是把日志相当于捕获到并显示在终端上,以后我们还可以自定义这个中间件,把日志记录到文件中。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
统计信息
    学员: 29204
    视频数量: 1985
    文章数量: 489

© 汕尾市求知科技有限公司 | Rails365 Gitlab | Qiuzhi99 Gitlab | 知乎 | b 站 | 搜索

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top