在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后面,我们还没有来得及注册,就出错了。
10
相似问题