例1:
func panicTest() {
defer func(){
if p:= recover(); p != nil {
fmt.Println("reover panic")
}
}()
panic(errors.New("this is a panic"))
}
func (u *User) OrgList(ctx *gin.Context) {
fmt.Println("before panic")
panicTest()
fmt.Println("after panic")
}
返回结果:
before panic
reover panic
after panic
例2:
func panicTest() {
/*defer func(){
if p:= recover(); p != nil {
fmt.Println("reover panic")
}
}()*/
panic(errors.New("this is a panic"))
}
func (u *User) OrgList(ctx *gin.Context) {
fmt.Println("before panic")
panicTest()
fmt.Println("after panic")
}
返回结果:
before panic
2020/08/10 09:59:04 http: panic serving [::1]:53170: this is a panic
goroutine 36 [running]:
net/http.(*conn).serve.func1(0xc0004140a0)
D:/go/src/net/http/server.go:1772 +0x140
panic(0xce2880, 0xc0002ae980)
D:/go/src/runtime/panic.go:973 +0x3a4
yunke_course/controller.panicTest(...)
D:/goproject/src/yunke_course/controller/user.go:44
yunke_course/controller.(*User).OrgList(0x15c7038, 0xc00050e000)
D:/goproject/src/yunke_course/controller/user.go:54 +0xbd
github.com/gin-gonic/gin.(*Context).Next(0xc00050e000)
D:/goproject/pkg/mod/github.com/gin-gonic/gin@v1.6.3/context.go:161 +0x42
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc00020bb80, 0xc00050e000)
D:/goproject/pkg/mod/github.com/gin-gonic/gin@v1.6.3/gin.go:409 +0x66d
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc00020bb80, 0xf62660, 0xc0002da380, 0xc000405100)
D:/goproject/pkg/mod/github.com/gin-gonic/gin@v1.6.3/gin.go:367 +0x154
net/http.serverHandler.ServeHTTP(0xc0002da2a0, 0xf62660, 0xc0002da380, 0xc000405100)
D:/go/src/net/http/server.go:2807 +0xaa
net/http.(*conn).serve(0xc0004140a0, 0xf64e60, 0xc000403440)
D:/go/src/net/http/server.go:1895 +0x873
created by net/http.(*Server).Serve
D:/go/src/net/http/server.go:2933 +0x363
注:
例1 中在defer的recover中使用panic程序虽然会抛出异常,但是不会停止运行
例2 直接panic的话就会抛出异常,程序停止运行