에러 처리 미들웨어 작성
핸들러 내에서 패닉이 발생했을 때 웹 서버를 종료하지 않고 500 에러를 출력하는 recoverHandler를 작성해 보자.
▼ middleware.go
func recoverHandler(next HandlerFunc) HandlerFunc { return func(c *Context) { defer func() { if err := recover(); err != nil { log.Printf("panic: %+v", err) http.Error(c.ResponseWriter, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) } }() next(c) } }
핸들러를 등록할 때 logHandler와 recoverHandler를 체인 형태로 묶어서 등록해 보자.
▼ main.go
r.HandleFunc("GET", "/users/:id", logHandler(recoverHandler(func(c *Context) { if c.Params["id"] == "0" { panic("id is zero") } fmt.Fprintf(c.ResponseWriter, "retrieve user %v\n", c.Params["id"]) })))
이제 웹 서버를 구동하고 웹 요청을 전송하여 logHandler와 recoverHandler가 잘 동작하는지 확인해 보자.
curl로 GET 요청을 전송한다.
$ curl http://localhost:8080/users/1
retrieve user 1
$ curl http://localhost:8080/users/0
Internal Server Error
웹 서버 로그를 확인한다.
$ ./app
2015/09/27 00:19:59 [GET] "/users/1" 35.953?s
2015/09/27 00:20:01 panic: id is zero
2015/09/27 00:20:01 [GET] "/users/0" 66.149?s