首页 > 编程语言 >前端程序员学习 Golang gin 框架实战笔记之三 panic 和 recovery

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

时间:2022-10-08 09:33:19浏览次数:77  
标签:defer recovery 中间件 Golang func gin main panic

上一节:前端程序员学习 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()
}

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

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

标签:defer,recovery,中间件,Golang,func,gin,main,panic
From: https://www.cnblogs.com/hfpp2012/p/16767981.html

相关文章

  • 知乎 《Cloudflare弃用NGINX,改用Rust编写的Pingora,你怎么看?》
    《Cloudflare弃用NGINX,改用Rust编写的Pingora,你怎么看?》    https://www.zhihu.com/question/554595029/answer/2688320831   。  ......
  • 【Golang】关于Go语言中条件变量 sync.Cond
    一、sync.Cond的使用场景一句话总结:sync.Cond 条件变量用来协调想要访问共享资源的那些goroutine,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的gorou......
  • 实用webpack插件之DefinePlugin
    通过阅读这篇文章,可以学习到如何使用DefinePlugin插件使得前端项目更加工程化,说清晰点就是如何使用这个插件,在编译阶段根据NODE_ENV自动切换配置文件,提升前端开发效率。Defi......
  • filebeat 自定义nginx的字段
    nginx配置:log_formatmain'$remote_addr-$remote_user[$year-$month-$day$hour:$minutes:$seconds]"$request"''$status$body_byt......
  • 基于Golang的简易缓存系统实现
    github:https://github.com/jwcen/gocache本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gocache-implement.html本项目,我们将了解缓存......
  • CentOS 7.9 安装 nginx-1.22.0
    一、CentOS7.9安装nginx-1.22.0下载地址:http://nginx.org/en/download.html2 安装前的准备 #操作系统内核版本uname-a#操作系统发行版本cat/etc/redhat......
  • 开源电子书 nginx开发手册文档 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1_LZNQWmpQno988_QDY06Og点击这里获取提取码 ......
  • Golang依赖包的各项指标分析总结
    专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章已收录,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源......
  • gin
    安装goget-ugithub.com/gin-gonic/gin  packagemainimport("github.com/gin-gonic/gin""log")funcmain(){engine:=gin.Default()engine.GET("/h......
  • AtCoder Beginner Contest 271
    咕咕咕咕。E-SubsequencePath最短路问题变种,Dijkstra最短路改改就行了。AC代码//Problem:E-SubsequencePath//Contest:AtCoder-KYOCERAProgrammingC......