在errWapper 里面 recover部分的逻辑 是一定要放在 handler 执行之后的吗

来源:9-4 测试http服务器(上)

满满回忆录

2020-07-22

在errWapper 里面 recover部分的逻辑 是一定要放在 handler 执行之后的吗?
我的理解是,defer最终都会执行,所有recover 和 handler 之间的顺序是可以变化,单是结果却不是,为什么呢

以下代码可以正常接到panic

defer func() {
			r := recover()
			if r != nil {
				log.Println("errWrapper Error:", r)
				http.Error(writer, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
			}
		}()
		err := handler(writer, request)

以下代码无法正常接到panic

err := handler(writer, request)
defer func() {
			r := recover()
			if r != nil {
				log.Println("errWrapper Error:", r)
				http.Error(writer, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
			}
		}()
写回答

1回答

ccmouse

2020-07-28

代码的执行是按顺序的。

只有在执行到defer func这一行,才会注册函数退出时必须执行的操作。注册完成后,才可以说这边的recover逻辑最终会被执行。

如果放在handler后面,我们还没有来得及注册,就出错了。

1
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程